コンソール/ bash-scriptingでシリーズを見ると

映画を見たいですか? I - はい、「ビッグバン理論»、«IT群集»、異なるアニメ...これは非常に中毒性があります。

これらすべてを表示するには、最も雑多なメディアプレーヤーmplayerのコンソールバージョンを使用します。 (赤い目とGUI対コンソールについてはholivarを控えましょう)しかし、残念なことに、新しいシリーズごとに次のような長いコマンドを再入力する必要があります。

 $ mplayer -ass -subcp cp1251 series_name_01_year_what_shit.mkv


このシート全体を最初から入力するのではなく、シリーズ番号のバックスペースで単純に消去し、新しい番号を書き、タブでファイル名の最後にタブを追加することは明らかです。 しかし、欠場し、不要な削除することが可能で、長いと不快です。

そして、多くの場合、新シリーズとして、並列に多くのシリーズを、見えます。 そして、私は最後の時間を停止し、そしてどのようなオプションとオプションはMPlayerを開始し、それが困難になる。どのシリーズに、覚えています それで、シェルに単純なプレーヤーランチャーを書くことにしました。これは、パラメーター、最後に見たエピソードの数を記憶し、起動コマンドで次のエピソードの数を置き換えることができます。



インターフェース



まず、このラッパーに必要なインターフェイスを決定しましょう。

非シリーズは、ほとんど常に二桁であるので、私は、シングルまたは3桁の数字のサポートを気にしませんでした。

ここでは、1回だけ実行されるように、元の構成のようになります。

 $ cd〜/ series_name#どこで何を見たいか
 $ ls#ビデオファイルの名前を見る
 serial_name_01_bla_bla.avi
 serial_name_01_bla_bla.srt
 serial_name_02_bla_bla.avi
 serial_name_02_bla_bla.srt
 ...
 $ serial set mask "serial_name _ ?? _ bla_bla.avi"#パラメーター名-「??」で置き換えられたシリーズ番号を持つビデオファイルの名前を指定します
 mplayerのを実行すると、キー - #シリアル設定オプション-subcp CP1251の#は、オプションのパラメータオプションを指定します


今見てください:

  $ serial next#最初から始めましょう
エピソード01の再生...
 ...
 $ serial next#いいね、次は
エピソード02の再生...
 ...
 $シリアル同じ#面白い瞬間を見た、同じエピソードを再視聴したい
エピソード02の再生...
 ...
 $ serial episode 14#特定のエピソードにジャンプ
エピソード14の再生...
 ...
真の$; ありません。 シリアルn; 睡眠1; 行わ;  #ノンストップ


そして、我々は、エピソードの名前を持っている場合は数シリーズだけでなく異なりますか? 次に、シェル置換を使用します。

  $ ls#ビデオファイルの名前を見る
 serial_name_01_qwerty.mkv
 serial_name_02_asdfgh.mkv
 $シリアルセットマスク「SERIAL_NAME _ ?? _ *。aviファイル」#スターのパラメータ名のCの置き換え置換を指定します
 $ serial set glob yes#ワイルドカードを実行




書く



デフォルト値を設定します、それは簡単です:

プレーヤー= mplayer
オプション= ""
エピソード= 00


視聴状況データはどこに保存しますか? まず、それが存在するフォルダーに直接書き込むという考えがありますが、CDからシリーズを見ると、このオプションは機能しません。CDは読み取り専用です。 また、ネットワーク共有(NFS /サンバ)またはtorrentokachalkiから単に間違って設定することができ権書き込み保護。

したがって、我々はあなたのホームフォルダに保持しますが、エピソードがあるファイルシステムへのパス上にもショーを識別します。 そこに会うことができるすべての特殊文字のスクリーニングに対処する必要がないように、便宜上、より良いまだ、それのハッシュを取ります。

 pwdhash = `pwd | md5sum | awk '{print $ 1}' '


それはまだそこにある場合、我々はすべて私たちの状態系列を保存するディレクトリを作成します。

テスト!  -d〜/ .serial &&ます。mkdir〜/ .serial


書き込むファイルの名前を定義します。

 savefile =〜/ .serial / $ pwdhash


この辺りのどこかで、sqliteやもっと難しいmysqlのような本格的なリレーショナルデータベースを使用できるというおかしなアイデアに感銘を受けましたが、その考えを時間内に追い払ったのです。さもないと、プレイヤーを包むのではなく、大きなモンスターが出てきました。

シリアル化について:データを保存する方法は? 完全に異なる目的を目的とするbashで新しく作成された形式を解析するために、私はまったく笑わなかったので、同じsh形式に環境変数があると判断しました。

ファイルが既に存在する場合はアップロードしましょう:

 if [-f $ savefile]
それから
     ready = "true"
     。  $ savefile
 fi


それで、シリーズでどのようなアクションを実行できますか? 私はこれらに決めました:

ケース$ 1 in
     #次のエピソードを開始
     n |次)
         #...
     ;;
     #もう一度見たエピソードを開始します
     s |同じ)
         #...
     ;;
     #エピソードをその番号で起動します 
     e | ep | episode)
         #...
     ;;
     #シリーズを見るためのパラメータを設定します
    セット)
         #...
     ;;
     #現在のステータスを表示
    ステータス|表示)
         #...
     ;;
     #そして、私が突然何かを忘れた場合の簡単なリファレンス。
     *)
         echo不明なコマンド。
         echoコマンド:
         echo next-以前にプレイしたものの隣のエピソードを再生します
        同じエコー-このエピソードをもう一度再生します
         echo show-現在の状態を表示します
        エコーエピソードNN-エピソードNNを再生
         echo set var_name value-変数を設定します
     ;;
エサック


個々のアクションの実装に進みます。

最初のステップは、我々はショーのビューを設定したりしていないかどうかを確認することです。 このアクションはほとんどすべてのコマンドで実行されるため、パラメーターをロードするときに変数セットの存在を検索し、そうでない場合はこの構成方法に関する指示を表示する関数にそれを配置します。

関数check_ready {
     if [-z "$ ready"]
    それから
         echoこのディレクトリは、シリアル番号を持つことは知られていません。
         echo次のコマンドを使用してセットアップします。
         " "$セット0マスク\" Movie_name_episode _ ?? _ smth.aviの\" エコー
         1番出口
     fi
 }


さて、実際には、起動も別の機能です:

関数起動{
     #...
 }


まず、現在のチャプター番号のタイトルに疑問を置き換えます。

映画= "`エコー\ "$マスクは、\ | "`" S / ?? / $エピソード/グラム\" \ sedの"


私は置換に問題がありました:それはbashではそれほど簡単ではないことが判明しました...さまざまな程度の倒錯の多くのオプションを試した後、私はこれに決めました、正直に言って、私はそれがどのように機能するか理解しませんでしたが、その副作用はマスクを指定するときにスペースをエスケープする必要があります。

 if ["$ glob" == "yes"]
それから
     movie = "$(eval" echo $ movie ")"
 fi


コメントでより良いオプションを提案できます。



受信した名前のファイルが存在することを確認してください。存在しない場合は、メッセージをダンプして終了する必要があります。

テスト!  「$映画」&&エピソード$エピソードを死ぬ見つからない-f


そうそう、ここで別のヘルパー関数です:メッセージを表示して終了します

関数die {
    エコー$ @
     1番出口
 }


起動起動機能の実装に戻りましょう。 設定ファイルに最後に再生されたエピソードの番号(および起動日)を保存します。

エコーエピソード= $エピソードdate` `で "#" >> $セーブファイル


現在のエピソードに関するメッセージを表示します。

 echo再生エピソード$ episode ...


そして最後に、我々はエピソードを指定した後、ユーザーを送信することができます私たちのプレーヤーの設定、ファイル、および追加の引数を、実行します

 $ player $ options "$ movie" "$ @"


すばらしい、起動機能の準備ができました! 少し残っています:ケースの構成を記入してください。 最も簡単なコマンドは同じです:

 s |同じ)
     check_ready
    シフト
     「$ @」を起動します
 ;;


次のエピソードを表示するには、変数をインクリメントする必要がありますが、同時にゼロビートを最初に保存します。 Awkはこのために思いつきました:

 n |次)
     check_ready
    エピソード= `エコー$エピソード| awkの '{printfの "%02D"、$ 1 + 1}'`
    シフト
     「$ @」を起動します
 ;;


これは、特定のエピソードを番号で開始する方法です。

 e | ep | episode)
     check_ready
     test -z "$ 2" && dieエピソードは指定されていません
    エピソード= 2ドル
    シフト
    シフト
     「$ @」を起動します
 ;;


そして今、完全に異なるもののために-変数の設定:

セット)
     #変数の名前が与えられたことを確認する
    テスト-z「$ 2」&&変数を死ぬ:エピソードマスクグロブオプションプレーヤー
     var_name = "$ 2"
     #意味に少なくとも何かがあることを確認する
     test -z "$ 3" && die値が指定されていません
    シフト
    シフト
     #そして、すべてを書き留めます:
     echo "$ var_name = \" $ @ \ "" "#" at `date` >> $ savefile
 ;;


最後に、現在の状態の出力:

ステータス|表示)
     check_ready
     echo最後にプレイしたエピソード$ episode
     echoオプションは$オプションです
     echo Savefileは$ savefileです
    エコーマスクは\ "$ mask \"です
    テスト-z "$ glob" || エコーグロビングが設定されています
 ;;


ここで、完成したが非常に文書化されていないバージョンのスクリプトを見ることができます。これは私が長い間積極的に使用してきましたbitbucket.org/tsx/env/src/tip/bin/serial



All Articles