Utilizzo di Automator per spostare i file dei sottotitoli

2

È possibile utilizzare Automator per spostare automaticamente un file di sottotitoli .srt nella cartella in cui si trova un file video con lo stesso nome?

Diciamo che ho un file ~/Videos/MyVideoFolder/my_video.avi e scarico un file ~/Downloads/my_video.srt , lo voglio spostare automagicamente su ~/Videos/MyVideoFolder/ .

I file dei sottotitoli sono identificabili dalla sua estensione .srt , ma i video possono essere di qualsiasi tipo.

    
posta Roberto 02.02.2014 - 11:09
fonte

3 risposte

3

È possibile utilizzare un flusso di lavoro delle azioni della cartella di Automator.

L'azione della cartella controlla la cartella dei download.

I filtri Filtri del filtro sono estensioni

L'Applescript fa il resto.

Codiceapplescript:

onrun{input,parameters}(*videofolderpath*)setfolderNameto"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

Il codice viene commentato per spiegare cosa sta facendo.

Questo è un esempio. Funziona come è nei miei test quando un file con l'estensione corretta viene aggiunto alla cartella controllata. Quindi li sposta nella cartella dei video se non esistono già lì. Puoi impostarlo per sovrascrivere se desideri rimuovere la condizione interna e utilizzare solo la prima condizione if con il codice di spostamento.

Non l'ho ancora provato, in realtà sto scaricando. Solo trascina e rilascia. Potrebbe essere necessario regolare se l'azione della cartella non viene rilevata nella modifica dell'estensione drom .download all'estensione effettiva del file

    
risposta data 02.02.2014 - 14:41
fonte
3

Considera l'utilizzo di AppleScript al posto di, o in combinazione con, Automator. Automator non si adatta facilmente ai flussi di lavoro che richiedono i rami condizionali.

I rami condizionali sono passaggi all'interno del flusso di lavoro che eseguono un'azione a seconda di alcuni stati o situazioni. In questo caso, se il file video è presente nella cartella di destinazione.

AppleScript può gestire questo tipo di attività; come potrebbe uno script perl o un altro linguaggio di scripting.

Vedi Può un ramo Automator basato sul valore di una variabile o il risultato di un passo? per un approccio basato su script combinato con Automator.

Approccio basato su script

Per attività come questa preferisco linguaggi di scripting come perl. Di seguito uno script che dovrebbe iniziare - o che altri possono sviluppare. Non è stato testato, quindi tratta con cura:

#!/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";
    }
}
    
risposta data 02.02.2014 - 12:27
fonte
2

Potresti anche usare uno script di shell come questo:

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

HaibisognodiBash4perglobstar,ilcherende**corrispondenteapiùlivellididirectory.PuoiinstallareBash4erenderlolatuashelldiaccessopredefinitaeseguendobrewinstallbash;echo/usr/local/bin/bash|sudotee-a/etc/shells;chsh-s/usr/local/bin/bash.

nullglobrendeimodellisenzacorrispondenzeespandibiliaunastringavuota.forf;doequivaleaforfin"$@"; do . Quando extglob è abilitato, @(srt|ass|ssa) corrisponde esattamente a uno su srt , ass e ssa . Bash non esegue la suddivisione di parole o l'espansione del nome file all'interno di [[ , quindi $f non deve essere quotato. printf %s\n stampa ogni argomento su una riga separata. ${f##*/} rimuove il pattern */ più lungo dall'inizio, ${base%???} rimuove gli ultimi tre caratteri, ${target%.*} rimuove il modello .* più corto dalla fine e ${base: -3} si espande negli ultimi tre caratteri. [[ $target ]] equivale a [[ -n $target ]] , o verifica se $target è impostato e non vuoto. exit 0 fa sì che Automator non visualizzi una finestra di errore se l'ultimo test termina con 1.

    
risposta data 02.02.2014 - 19:56
fonte

Leggi altre domande sui tag