понедельник, 1 апреля 2024 г.

Thunar: особое действие "Загрузка файлов на яндекс-диск"

Translator
Translator

 Очередной диск неожиданно скончался со всем нажитым непосильным трудом. Посему опять озадачился созданием архивных копий. 

На этот раз создавать архивные копии будем на яндекс-диск.

Для этого создаем скрипт bash (я назвал его ya_upload.sh) следующего содержания:

#!/bin/bash
# Токен доступа к API Яндекс.Диска
accessToken="ваш токен"
 
# Путь к файлу, который нужно загрузить на Яндекс.Диск
fileToUpload=$1
 
# Путь, по которому следует загрузить файл на Яндекс.Диск
uploadDir="/Backup/"
 
# Получаем имя файла из пути
fileName=$(basename "$fileToUpload")
 
# Формируем полный путь загрузки файла
uploadPath="$uploadDir$fileName"
 
# Временное расширение файла для ускорения загрузки (почему-то некоторые файлы на яндекс грузятся медленно)
tmpExt=".tmp"
 
# URL для запроса загрузки файла
uploadRequestUrl="https://cloud-api.yandex.net/v1/disk/resources/upload?path=$uploadPath$tmpExt&overwrite=true"
 
# Максимальное количество попыток загрузки файла
maxRetryAttempts=3
retryCount=0
 
while [ $retryCount -lt $maxRetryAttempts ]; do
    # GET-запрос для получения URL загрузки
    response=$(curl -s -X GET -H "Authorization: OAuth $accessToken" "$uploadRequestUrl")
 
    # Получаем URL для загрузки файла
    uploadUrl=$(echo $response | jq -r '.href')
 
    # Попытка загрузить файл на Яндекс.Диск
    curl -s -X PUT -T "$fileToUpload" "$uploadUrl"
 
    if [ $? -eq 0 ]; then
        #echo "Файл успешно загружен на Яндекс.Диск."
        zenity --info --text="Файл успешно загружен на Яндекс.Диск."
 
        # Переименование файла на сервере Яндекс.Диска
        moveResponse=$(curl -s -X POST \
            -H "Authorization: OAuth $accessToken" \
            "https://cloud-api.yandex.net/v1/disk/resources/move?path=$uploadPath&from=$uploadPath$tmpExt&overwrite=true")
        break
    else
        zenity --info --text="Произошла ошибка при загрузке файла на Яндекс.Диск."
        if [[ $response == *"Precondition Failed"* ]]; then
            range=$(echo "$response" | jq -r '.Range')
            startByte=$(echo "$range" | awk -F'-' '{print $2}' | awk '{print $1 + 1}')
 
            # Догружаем недостающие части файла
            curl -s -X PUT -H "Content-Range: bytes $startByte-" --data-binary "@$fileToUpload" "$uploadUrl"
 
            zenity --info --text="Файл успешно догружен на Яндекс.Диск."
            break
        else
            zenity --info --text="Не удалось обработать ошибку загрузки файла."
            retryCount=$((retryCount+1))
            if [ $retryCount -lt $maxRetryAttempts ]; then
                zenity --info --text="Повторная попытка загрузки файла ($retryCount из $maxRetryAttempts)."
            else
                zenity --info --text="Достигнуто максимальное количество попыток загрузки файла."
            fi
        fi
    fi
done 


Скрипт не мой, я его подсмотрел у доброго человека, ссылку, к сожалению потерял.  Я лишь поменял вывод сообщений в терминале на zenity.

Далее создаем в Thunar особое действие, назовем его, например так: "Отправить файл на яндекс-диск" и в качестве команды укажем:

/home/user/path/ya_upload.sh %f

Маска файла - *.*, галочки поставьте на те типы файлов, какие вам нужны.

Чтобы скрипт заработал вам необходимо:

 1. получить от Яндекса токен для вашего приложения, который годен в течение года. Процедура получения токена очень проста и заняла у меня меньше 5 минут. Ее можно посмотреть, например, здесь

После получения токена его нужно прописать в ваш скрипт в строке accessToken="ваш токен", поместив его в кавычках вместо слов ваш токен.

2. Прописать путь к папке на яндекс-диске, в которую будут сыпаться ваши скопированные файлы. У меня это сделано в строке uploadDir="/Backup/"

3. Убедиться, что у вас в системе установлен zenity.

Все.

Теперь в контекстном меню Thunar появиться соответствующий пункт меню, предлагающий

Комментариев нет:

Отправить комментарий