Automatorを使用して字幕ファイルを移動する


2

Automatorを使用して、字幕ファイル.srtを同じ名前のビデオファイルが置かれているフォルダーに自動的に移動することは可能ですか?

ファイルがあり、ファイル~/Videos/MyVideoFolder/my_video.aviをダウンロードしたとしましょう。~/Downloads/my_video.srt自動的にファイルをに移動し ~/Videos/MyVideoFolder/ます。

字幕ファイルは拡張子.srtで識別できますが、ビデオはどのタイプでもかまいません。


自動的に?その言葉を発明しましたか?
ラスケ14

いつそれが起こりますか?ダウンロード前またはダウンロード後。ダウンロード用のフォルダーを指定して、既にそこにあるようにすることができます。どのダウンロードがどこに属しているかを知るために、自動魔法はどのようになりますか?
ラスケ14

「自動で」という言葉が大好きです。自動化したものが複雑になり、その方法を説明するときに使用します。
マークハンテ

回答:


3

Automatorフォルダーアクションワークフローを使用できます。

フォルダーアクションは、ダウンロードフォルダーを監視します。

フィルターのFinder項目のフィルタは、拡張可能

Applescriptが残りを行います。

ここに画像の説明を入力してください


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

コードはコメントを付けて、コードの実行内容を説明します。

これは一例です。正しい拡張子のファイルが監視フォルダーに追加されると、テストでそのまま機能します。次に、それらがまだ存在しない場合は、videosフォルダーに移動します。内部のif条件を削除する場合は上書きするように設定し、moveコードで最初のif条件を使用するだけです。

実際にダウンロードすることをテストしていません。ドラッグアンドドロップのみ。フォルダーのアクションが拡張子変更drom .download を実際の拡張子のファイルに反映しない場合は、調整する必要があります。


3

Automatorの代わりに、またはAutomatorと組み合わせてAppleScriptを使用することを検討してください。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";
    }
}

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 forが必要です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)のうちの正確に一つに一致するsrtassssa。Bashは内部[[で単語の分割やファイル名の展開$fを行わないため、引用符で囲む必要はありません。printf %s\\n各引数を個別の行に出力します。開始から${f##*/}最も長い*/パターンを${base%???}削除し、最後の3文字を削除し、最後から${target%.*}最も短い.*パターンを削除${base: -3}し、最後の3文字に展開します。[[ $target ]]はと同等です[[ -n $target ]]。または、$targetが設定されていて空ではないかどうかをテストします。exit 0最後のテストが1で終了した場合、Automatorはエラーダイアログを表示しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.