Использование Automator для перемещения файлов субтитров

2

Можно ли использовать Automator для автоматического перемещения файла субтитров? .srt в папку, где находится видеофайл с таким же именем?

Допустим, у меня есть файл ~/Videos/MyVideoFolder/my_video.avi и я скачиваю файл ~/Downloads/my_video.srtЯ хочу, чтобы он автоматически переместился в ~/Videos/MyVideoFolder/,

Файлы субтитров идентифицируются по расширению .srt , но видео может быть любого типа.

Roberto
источник
автомагически ?? Вы изобрели это слово?
Buscar웃
Когда вы хотите, чтобы это произошло? Перед загрузкой или после загрузки. Вы можете указать папку для загрузки, чтобы она уже была там. Как автоматическое предположение, чтобы узнать, какая загрузка принадлежит, где?
Buscar웃
Мне нравится это слово «автоматически», я собираюсь использовать его, когда что-то, что я автоматизировал, должно быть сложным, чтобы объяснить, как я это сделал.
markhunte

Ответы:

3

Вы можете использовать рабочий процесс действий папки Automator.

Действие папки отслеживает папку загрузок.

Фильтр искателей фильтры быть расширением

Applescript делает все остальное.

enter image description here


Код Applescript:

on run {input, parameters}
    (* video folder path *)
    set folderName to "videos:MyVideoFolder"
    set homePath to (path to home folder as text) as text
    set thepath to POSIX path of (homePath & folderName)

    (* repeat with the srt files from input*)
    repeat with i from 1 to number of items in input
        set this_item to (item i of input as text)

        (* get the file name *)
        set baseName to (do shell script "basename  " & quoted form of (POSIX path of this_item))
        (* strip the extension from the name *)
        set fileName to (do shell script "echo  " & quoted form of baseName & "  |cut -d'.' -f1")


        (*test if a Video file with the name fileName  exists in the video folder *)
        if (do shell script "/bin/test -e " & (quoted form of (thepath & "/") & fileName & ".") & "*  ; echo $?") is "0" then
            --0 = exists

            (*test if a srt file with the exact name baseName extension exists in the video folder *)
            if (do shell script "/bin/test -e " & (quoted form of (thepath & "/" & baseName)) & "  ; echo $?") is "1" then
                --1 = not exists


                (*move the scrt file *)
                do shell script " /bin/mv " & (POSIX path of this_item) & space & thepath & "/\"\""
            end if

        end if

    end repeat

end run

Код комментируется, чтобы объяснить, что он делает.

Это пример. Он работает как в моих тестах, когда файл с правильным расширением добавляется в наблюдаемую папку. Затем перемещает его / их в папку с видео, если они там еще не существуют. Вы можете установить его на перезапись, если вы хотите удалить внутреннюю если условие и просто используйте первое условие if с кодом перемещения.

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

markhunte
источник
3

Попробуйте использовать AppleScript вместо или в сочетании с Automator. Automator нелегко вписывается в рабочие процессы, требующие условных переходов.

Условные ветви - это шаги в рабочем процессе, которые выполняют действие в зависимости от некоторого состояния или ситуации. В этом случае, если видеофайл присутствует в папке назначения.

AppleScript может справиться с этим типом задачи; как и Perl-скрипт или другой скриптовый язык.

Увидеть Может ли Automator ветвиться на основе значения переменной или результата шага? для подхода на основе сценариев в сочетании с Automator.

Скриптовый подход

Для таких задач я предпочитаю скриптовые языки, такие как perl. Ниже приведен сценарий, с которого следует начать - или на котором могут основываться другие. Это не проверено, поэтому относитесь с осторожностью:

#!/usr/bin/env perl

use strict;
use warnings;

use File::Basename; # for fileparse

# WARNING: lack of error checking

# Use: ./move_srt.pl <path to source folder> <path to destination folder>

my $source_path = shift;
my $destination_path = shift;

# Get the video file names - without their 3 or 4 letter suffixes
my @destination_video_files = glob($source_path.'/*');
my %named_video_files = map { $_ => fileparse($_,qr/\..{3,4}/); } @destination_video_files;

# Get a list of srt files
my @source_srt_files = glob($source_path.'/*\.srt');

foreach my $source_srt_file (@source_srt_files) {
    print "[Encountered] $source_srt_file\n";

    # Strip suffix and check if video exists with same name
    my $named_srt_file = fileparse($source_srt_file,qr/\.srt/);
    if (exists($named_video_files{$named_srt_file})) {

        # Move the matching srt File
        system('/bin/mv '.$source_srt_file.' '.$destination_path);

        print "[Matched] $source_srt_file\n";
    } else {
        print "[Unmatched] $source_srt_file\n";
    }
}
Graham Miln
источник
2

Вы также можете использовать скрипт оболочки следующим образом:

shopt -s globstar extglob nullglob
for f; do
  [[ $f != *.@(srt|ass|ssa) ]] && continue
  base=${f##*/}
  target=$(printf %s\\n ~/Movies/**/"${base%???}"* | head -n1)
  [[ $target ]] && mv "$f" "${target%.*}.${base: -3}"
done
exit 0

Вам нужен Bash 4 для globstar, что делает ** соответствовать нескольким уровням каталогов. Вы можете установить Bash 4 и сделать его оболочкой входа по умолчанию, запустив brew install bash;echo /usr/local/bin/bash|sudo tee -a /etc/shells;chsh -s /usr/local/bin/bash,

nullglob делает шаблоны без совпадений расширяющимися до пустой строки. for f; do эквивалентно for f in "$@"; do, когда extglob включен, @(srt|ass|ssa) соответствует ровно одному из srt, ass, а также ssa, Bash не выполняет разбиение слов или расширение имени файла внутри [[, так $f не нужно цитировать printf %s\\n печатает каждый аргумент в отдельной строке. ${f##*/} удаляет самый длинный */ шаблон с самого начала, ${base%???} удаляет последние три символа, ${target%.*} удаляет самый короткий .* шаблон с конца, и ${base: -3} расширяется до последних трех символов. [[ $target ]] эквивалентно [[ -n $target ]]или он проверяет, если $target установлен и не пуст. exit 0 заставляет Automator не отображать диалоговое окно с ошибкой, если последний тест завершается с 1.

user495470
источник