Как удалить загруженный видеофайл после слияния видео и аудио? - PullRequest
0 голосов
/ 09 мая 2019

Я загрузил видео с разрешением 1080p с YouTube, используя YouTube. Видео файл (.f137.mp4) и аудио файлы (f140.m4a) были загружены. Они ffmpeg объединили видеофайл и аудиофайл в файл mp4 (.mp4). Я хочу сохранить файл .f140.m4a и файл .mp4, а удалить файл f137.mp4. Как я могу это сделать?

Я попробовал опцию --exec в youtube-dl, но она не удалась.

Это были мои команды:

root@OMV:~/youtube-dl# cat dl-test.sh
DL_DIR="/srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007"
ALBUM="Test"
mkdir -p "$DL_DIR/$ALBUM"
youtube-dl --batch-file  /root/youtube-dl/url-test.list --download-archive /root/youtube-dl/archive-test.list                           \
-f  'bestvideo[ext=mp4]+bestaudio[ext=m4a]/bestvideo+bestaudio'                                 \
--write-sub --embed-sub --all-subs                                                              \
--embed-thumbnail --add-metadata                                                                \
-o "$DL_DIR/$ALBUM/%(title)s.%(ext)s"                                                           \
--exec "rm "$(ls {} | cut -d . -f1)""

Результат был:

root@OMV:~/youtube-dl# ./dl-test.sh
ls: cannot access '{}': No such file or directory
...
[ffmpeg] Merging formats into "/srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test/UpTown Spot.mp4"
...
[atomicparsley] Adding thumbnail to "/srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test/UpTown Spot.mp4"
[exec] Executing command: rm  '/srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test/UpTown Spot.mp4'

Файл .mp4 был удален, файл .f137.mp4 все еще был там. Я получил противоположный результат.

root@OMV:~/youtube-dl# ls '/srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test'
UpTown Spot.f137.mp4  UpTown Spot.f140.m4a

Обновление 1: Я изменил на

--exec "rm "$(ls {} -1 | sed -n '/\.f[0-9]*\.mp4$/p')""

Он по-прежнему удаляет файл .mp4. Выход был:

root@OMV:~/youtube-dl# echo "" > "/root/youtube-dl/archive-test.list"
root@OMV:~/youtube-dl# ./dl-test.sh
ls: cannot access '{}': No such file or directory
...
[download] /srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test/UpTown Spot.mp4 has already been downloaded and merged
...
[exec] Executing command: rm  '/srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test/UpTown Spot.mp4'

Затем изменил его на:

--exec "rm "$(ls -1 | sed -n '/\.f[0-9]*\.mp4$/p')""

Выход был почти таким же:

root@OMV:~/youtube-dl# ./dl-test.sh
...
[exec] Executing command: rm  '/srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test/UpTown Spot.mp4'

Я проверил нормальное выражение в SHELL, оно сработало:

root@OMV:~/youtube-dl# cd /srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test
root@OMV:/srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test# ls "$(ls  /srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test | sed -n '/\.f[0-9]*\.mp4$/p')"
UpTown Spot.f137.mp4
root@OMV:/srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test# rm "$(ls  /srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test | sed -n '/\.f[0-9]*\.mp4$/p')"

Но подобная команда, запущенная в опции youtube-dl --exec, не удалась!

Обновление 2: Казалось, что cmd после конвейера не будет выполнен.

root@OMV:~/youtube-dl# ./dl-test.sh
+ DL_DIR=/srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007
+ ALBUM=Test
+ mkdir -p /srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test
+ youtube-dl --batch-file /root/youtube-dl/url-test.list --download-archive /root/youtube-dl/archive-test.list -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/bestvideo+bestaudio' --write-sub --embed-sub --all-subs --embed-thumbnail --add-metadata -o '/srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test/%(title)s.%(ext)s' --exec 'ls | grep mp4'
...
[exec] Executing command: ls | grep mp4 '/srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test/UpTown Spot.mp4'
Binary file /srv/dev-disk-by-id-ata-QEMU_HARDDISK_QM00007/Test/UpTown Spot.mp4 matches
ls: write error: Broken pipe

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

Я решил проблему, добавив хук скриптов.Вот мой dl.sh:

root@OMV:~/youtube-dl# cat dl.sh
#!/bin/bash

DL_DIR="$1"
ALBUM="$2"
SAVE_DIR="$DL_DIR/$ALBUM"
WORK_DIR=$(dirname $(readlink -f "$0"))
URL_LIST="$WORK_DIR/url.list"
ARCHIVE_LIST="$WORK_DIR/archive.list"
HOOK="$WORK_DIR/hook.sh"

if      [ ! -n "$DL_DIR" ] ||[ ! -n "$ALBUM" ];
then
        echo "Usage: $0 <download_dir> <album_name>"
        exit 1
fi

mkdir -p "$SAVE_DIR"
youtube-dl --batch-file  $URL_LIST --download-archive $ARCHIVE_LIST            \
-f  'bestvideo[ext=mp4]+bestaudio[ext=m4a]/bestvideo+bestaudio'                \
--write-sub --embed-sub --all-subs                                             \
--embed-thumbnail --add-metadata                                               \
-o "$SAVE_DIR/%(title)s.%(ext)s"                                               \
--exec $HOOK

А это мой hook.sh:

root@OMV:~/youtube-dl# cat hook.sh
#!/bin/bash
file="$1"
file_full_name=$(readlink -f "$file" -n)
dir=$(dirname "$file_full_name")
file_rm=$(ls "$dir" | sed -n '/\.f[0-9]*\.mp4$/p')
#echo "file to be removed = $file_rm"
rm -i "$dir/$file_rm"

Спасибо всем за ваши советы!

0 голосов
/ 09 мая 2019

попробуйте это:

изменить

$(ls {} | cut -d . -f1)

до

$(ls -1 {} | sed -n '/\.f[0-9]*\.mp4$/p')

Объяснение

ls -1      # print every file in one line

sed -n     # suppress automatic output
'/\.       # pattern start with .
f          # followed by f
[0-9]*     # some numbers
\.mp4$     # and .mp4
/p'        # print line
...