2 votos

Uso de Automator para mover archivos de subtítulos

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

Digamos 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 vídeos pueden ser de cualquier tipo.

3voto

Steve Evans Puntos 155

Considere el uso de AppleScript en lugar de, o en combinación con, Automator. Automator no se adapta fácilmente a 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 vídeo está presente en la carpeta de destino.

AppleScript puede encargarse de este tipo de tareas, al igual que un perl script u otro lenguaje de scripting.

Ver ¿Puede Automator ramificarse en función del valor de una variable o del resultado de un paso? para un enfoque basado en script combinado con Automator.

Enfoque guionizado

Para tareas como ésta prefiero los lenguajes de scripting como el perl. A continuación hay un script</strkeep><strkeep> que debería servirte para empezar - o que otros pueden utilizar. No ha sido probado, así que trátalo 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";
    }
}

3voto

Malik hassan Puntos 16

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

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

El Filtrar elementos del buscador filtros ser extensión

El Applescript hace el resto.

enter image description here


Código 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

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

Este es un ejemplo. Funciona tal cual en mis pruebas cuando se añade un archivo con la extensión correcta a la carpeta vigilada. Entonces lo mueve a la carpeta de vídeos si no existe ya allí. Usted puede configurar para sobrescribir si desea ser la eliminación de la interna si la condición y sólo utilizar la primera condición if con el código de movimiento.

No he probado que se descargue realmente. Sólo arrastrar y soltar. Es posible que tenga que ajustar si la acción de la carpeta no recoge el cambio de extensión drom .descargar a la extensión real del archivo

2voto

También puedes usar un shell script 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

Necesitas Bash 4 para globstar que hace que ** coinciden con varios niveles de directorios. Puedes instalar Bash 4 y convertirlo en tu shell de inicio de sesión por defecto ejecutando brew install bash;echo /usr/local/bin/bash|sudo tee -a /etc/shells;chsh -s /usr/local/bin/bash .

nullglob hace que los patrones sin coincidencias se expandan a una cadena vacía. for f; do equivale a for f in "$@"; do . Cuando extglob está activado, @(srt|ass|ssa) coincide exactamente con uno de srt , ass y ssa . Bash no realiza la división de palabras ni la expansión de nombres de archivos dentro de [[ Así que $f no tiene que ser citado. printf %s\\n imprime cada argumento en una línea separada. ${f##*/} elimina el más largo */ patrón desde el principio, ${base%???} elimina los tres últimos caracteres, ${target%.*} elimina el más corto .* patrón desde el final, y ${base: -3} se expande hasta los tres últimos caracteres. [[ $target ]] equivale a [[ -n $target ]] o comprueba si $target está configurado y no está vacío. exit 0 hace que Automator no muestre un diálogo de error si la última prueba sale con 1.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X