2 votes

Utilisation d'Automator pour déplacer des fichiers de sous-titres

Est-il possible d'utiliser Automator pour déplacer automatiquement un fichier de sous-titres ? .srt dans le dossier où se trouve un fichier vidéo portant le même nom ?

Disons que j'ai un fichier ~/Videos/MyVideoFolder/my_video.avi et je télécharge un fichier ~/Downloads/my_video.srt je veux qu'il soit automatiquement déplacé vers ~/Videos/MyVideoFolder/ .

Les fichiers de sous-titres sont identifiables par leur extension .srt mais les vidéos peuvent être de n'importe quel type.

3voto

Graham Miln Points 39606

Envisagez d'utiliser AppleScript au lieu de, ou en combinaison avec, Automator. Automator ne s'adapte pas facilement aux flux de travail qui nécessitent des branchements conditionnels.

Les branches conditionnelles sont des étapes du flux de travail qui exécutent une action en fonction d'un état ou d'une situation. Dans ce cas, si le fichier vidéo est présent dans le dossier de destination.

AppleScript peut gérer ce type de tâche, tout comme un script perl ou un autre langage de script.

Ver Automator peut-il effectuer des branchements en fonction de la valeur d'une variable ou du résultat d'une étape ? pour une approche basée sur script combinée à Automator.

Approche scénarisée

Pour ce genre de tâches, je préfère les langages de script comme perl. Vous trouverez ci-dessous un script qui devrait vous permettre de démarrer - ou sur lequel d'autres pourront s'appuyer. Il n'est pas testé, donc à traiter avec précaution :

#!/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

markhunte Points 11634

Vous pouvez utiliser un flux de travail d'action de dossier Automator.

L'action dossier surveille le dossier des téléchargements.

Le site Éléments du filtre Finder les filtres sont des extensions

L'Applescript fait le reste.

enter image description here


Code 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

Le code est commenté pour expliquer ce qu'il fait.

Voici un exemple. Il fonctionne tel quel sur mes tests lorsqu'un fichier avec l'extension correcte est ajouté au dossier surveillé. Ensuite, il le(s) déplace(nt) vers le dossier des vidéos s'il(s) n'y existe(nt) pas déjà. Vous pouvez le configurer pour écraser si vous le souhaitez, en supprimant le fichier interne. si la condition et utiliser simplement la première condition if avec le code move.

Je ne l'ai pas testé en le téléchargeant. Seulement le glisser-déposer. Vous devrez peut-être faire des ajustements si l'action du dossier ne détecte pas le changement d'extension. .télécharger à l'extension réelle du fichier

2voto

Vous pourriez également utiliser un script shell comme ceci :

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

Vous avez besoin de Bash 4 pour globstar ce qui rend ** correspondent à plusieurs niveaux de répertoires. Vous pouvez installer Bash 4 et en faire votre shell de connexion par défaut en exécutant brew install bash;echo /usr/local/bin/bash|sudo tee -a /etc/shells;chsh -s /usr/local/bin/bash .

nullglob fait en sorte que les motifs sans correspondance se développent en une chaîne vide. for f; do est équivalent à for f in "$@"; do . Quand extglob est activé, @(srt|ass|ssa) correspond à un seul des srt , ass et ssa . Bash n'effectue pas le découpage des mots ou l'expansion des noms de fichiers à l'intérieur de . [[ donc $f n'a pas besoin d'être cité. printf %s\\n imprime chaque argument sur une ligne séparée. ${f##*/} supprime le plus long */ dès le départ, ${base%???} supprime les trois derniers caractères, ${target%.*} supprime le plus court .* de l'extrémité, et ${base: -3} s'étend aux trois derniers caractères. [[ $target ]] est équivalent à [[ -n $target ]] ou il teste si $target est fixé et non vide. exit 0 fait en sorte que Automator n'affiche pas de boîte de dialogue d'erreur si le dernier test se termine par 1.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X