Usando Automator para mover archivos de subtítulos

2

¿Es posible usar Automator para mover automáticamente un archivo de subtítulos .srt a la carpeta donde se encuentra un archivo de video con el mismo nombre?

Supongamos que tengo un archivo ~/Videos/MyVideoFolder/my_video.avi y descargo un archivo ~/Downloads/my_video.srt , quiero que lo mueva automáticamente a ~/Videos/MyVideoFolder/ .

Los archivos de subtítulos son identificables por su extensión .srt , pero los videos pueden ser de cualquier tipo.

    
pregunta Roberto 02.02.2014 - 11:09

3 respuestas

3

Puede utilizar un flujo de trabajo de acción de carpeta de Automator.

La acción de carpeta observa la carpeta de descargas.

Los Elementos del Buscador de filtros son la extensión

El Applescript hace el resto.

CódigodeApple:

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

El código está comentado para explicar lo que está haciendo.

Este es un ejemplo. Funciona como está en mis pruebas cuando se agrega un archivo con la extensión correcta a la carpeta vigilada. Luego, los mueve a la carpeta de videos si aún no existen. Puede configurarlo para sobrescribir si desea eliminar la condición interna si es y simplemente usar la primera condición si con el código de movimiento.

No lo he probado estar descargando realmente. Sólo arrastrar y soltar. Es posible que tenga que ajustar si la acción de la carpeta no detecta la extensión drom .download a la extensión real del archivo

    
respondido por el markhunte 02.02.2014 - 14:41
3

Considere usar AppleScript en lugar de, o en combinación con, Automator. Automator no encaja fácilmente en los flujos de trabajo que requieren ramas condicionales.

Las ramas condicionales son pasos dentro del flujo de trabajo que realizan una acción dependiendo de algún estado o situación. En este caso, si el archivo de video está presente en la carpeta de destino.

AppleScript puede manejar este tipo de tarea; al igual que un script en perl u otro lenguaje de scripting.

Consulte ¿Puede Automator derivarse según el valor de una variable o el resultado de un paso? para un enfoque basado en script combinado con Automator.

Enfoque de script

Para tareas como esta, prefiero lenguajes de script como perl. A continuación encontrará un script que lo ayudará a comenzar, o que otros pueden desarrollar. No está probado, así que trate con cuidado:

#!/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";
    }
}
    
respondido por el Graham Miln 02.02.2014 - 12:27
2

También puedes usar un script de shell como este:

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

NecesitasBash4paraglobstar,loquehaceque**coincidaconmúltiplesnivelesdedirectorios.PuedesinstalarBash4yconvertirloentushelldeiniciodesesiónpredeterminadoejecutandobrewinstallbash;echo/usr/local/bin/bash|sudotee-a/etc/shells;chsh-s/usr/local/bin/bash.

nullglobhacequelospatronessincoincidenciasseexpandanaunacadenavacía.forf;doesequivalenteaforfin"$@"; do . Cuando extglob está habilitado, @(srt|ass|ssa) coincide exactamente con uno de srt , ass y ssa . Bash no realiza la división de palabras ni la expansión del nombre de archivo dentro de [[ , por lo que $f no tiene que ser citado. printf %s\n imprime cada argumento en una línea separada. ${f##*/} elimina el patrón */ más largo del inicio, ${base%???} elimina los tres últimos caracteres, ${target%.*} elimina el patrón .* más corto del final y ${base: -3} se expande hasta los tres últimos caracteres. [[ $target ]] es equivalente a [[ -n $target ]] , o prueba si $target está configurado y no está vacío. exit 0 hace que Automator no muestre un cuadro de diálogo de error si la última prueba sale con 1.

    
respondido por el user495470 02.02.2014 - 19:56

Lea otras preguntas en las etiquetas