ファイルを消した番組を PCast のリストから消す


一言でうまく表現できないので意味不明のタイトルになってしまった。
つまり、、、
ハック de 録!! で録画した番組を見たら、 そのファイルはエクスプローラで消している。
ところが、ファイルを消しても
  • PCast の Web 画面の「録画一覧」

  • PCastLink のリストウインドウ

  • には残ったままで、ファイルの有り無しに関わらずリストされてしまう。
    もう見終わった番組までリストされるのは邪魔なので、 それを消してしまおうと言う作戦である。

    録画一覧

    録画一覧は、
    /usr/local/PCast/DbAcRap GetPlListBottom
    で取得できるようだ。
    一つの番組は、
    [DATA]Index=0060 TittleName=【は】美の京都遺産_0129
    [DATA]Index=0060 Status=2
    [DATA]Index=0060 ResType=0
    [DATA]Index=0060 Formet=4
    [DATA]Index=0060 Reserve1=0
    [DATA]Index=0060 Reserve2=0
    [DATA]Index=0060 Start=2006/01/29/06/15
    [DATA]Index=0060 End=2006/01/29/06/30
    [DATA]Index=0060 TvChannel=4
    [DATA]Index=0060 TvAudioMode=2
    [DATA]Index=0060 DeviceId=0
    [DATA]Index=0060 FileName=/mnt/share/【は】美の京都遺産_0129.mpg
    [DATA]Index=0060 DataKey=1138482900
    
    のように出力される。
    (TittleName は EUC で、FileName は S-JIS でエンコードされている)

    削除

    リストから番組を削除するには、
    /usr/local/PCast/DbAcRap DelPlKey\{DataKey\}
    とすれば良いようだ。
    DataKey は、上記の例だと
    [DATA]Index=0060 DataKey=1138482900
    
    の DataKey= の右辺(1138482900)で、具体的には
    /usr/local/PCast/DbAcRap DelPlKey\{1138482900\}
    と実行する。

    ファイルを消した番組をリストから消すスクリプト

    すべての録画リストの
    FileName= で示されたファイルが存在しなければ、
    その番組の DataKey を求め、
    /usr/local/PCast/DbAcRap DelPlKey\{DataKey\}
    を実行する
    スクリプトを書けば良い。

    少々汚いスクリプトになってしまった、、、(汗)


    #!/bin/sh
    TMPFILE=/tmp/remove_list.$$
    
    /usr/local/PCast/DbAcRap GetPlListBottom > $TMPFILE
    
    sed -n -e 's/^.*Index=\([0-9]*\)[ 	]*FileName=\(.*\)/\1 \2/p' $TMPFILE |
    while read Index FileName
    do
    	if [ ! -f $FileName ]
    	then
    		echo $FileName not found | nkf -e
    		DataKey=`sed -n -e 's/^.*Index='$Index'[ 	]*DataKey=\(.*\)/\1/p' $TMPFILE`
    		/usr/local/PCast/DbAcRap DelPlKey\{$DataKey\}
    	fi
    done
    rm $TMPFILE
    

    sed の引数に出てくる [ ] の中は、スペースとタブ。2ヶ所

    解説

    たまには、解説でもしてみよう。

    #!/bin/sh
    インタプリタとして /bin/sh を使いますよという合言葉

    TMPFILE=/tmp/remove_list.$$
    テンポラリファイルの指定。
    $$ にはスクリプトの PID が入るのでユニークなファイル名となり、 バッティングすることがない。
    同時に複数起動することがなければ余り意味はない。

    /usr/local/PCast/DbAcRap GetPlListBottom > $TMPFILE
    /usr/local/PCast/DbAcRap GetPlListBottom を実行し、 その結果(の標準出力)をテンポラリファイルにセーブする

    sed -n -e 's/^.*Index=\([0-9]*\)[ ]*FileName=\(.*\)/\1 \2/p' $TMPFILE |
    これは複雑。
    (  ^.*:行頭から何らかの文字があって、
     Index=\([0-9]*\):Index=に続く数字列があれば一つ目のバッファに記憶し、
     [ ]*:スペースかタブがいくつかあって、
     FileName=\(.*\):FileName=に続く文字列があれば2つ目のバッファに記憶
    )に一致する行があれば、それを
    一つ目のバッファ(スペース)二つ目のバッファ
    に置き換える。
    つまり、
    [DATA]Index=0060 FileName=/mnt/share/【は】美の京都遺産_0129.mpg
    という条件に一致する行を
    0060 /mnt/share/【は】美の京都遺産_0129.mpg
    に置き換える。

    行末に | があるので、次のコマンドの標準入力とする

    while read Index FileName
    標準入力が EOF になるまで行を読込み、 1フィールド目を Index という変数に、 2フィールド目を FileName という変数に代入、 do 〜 done までを実行する。
    上記の例だと
    Index は1フィールド目の「0060」
    FileName は2フィールド目の「/mnt/share/【は】美の京都遺産_0129.mpg」
    となる。

    if [ ! -f $FileName ]
    もし FileName で示されたファイルが存在しないなら、then 〜 fi を実行

    echo $FileName not found | nkf -e
    気休めにメッセージを表示。
    FileName は S-JIS なので、nkf で EUC に変換

    DataKey=`sed -n -e 's/^.*Index='$Index'[ ]*DataKey=\(.*\)/\1/p' $TMPFILE`
    疲れてきた。
    sed は「[DATA]Index=0060 DataKey=ホゲホゲ」という行を探し、 ホゲホゲを標準出力に出力する。
    コマンドが`(逆シングルコート)でくくられた場合、 その標準出力を文字列と扱う。ここでは、DataKey に代入
    結果、DataKey は 1138482900

    /usr/local/PCast/DbAcRap DelPlKey\{$DataKey\}
    番組をリストから削除

    rm $TMPFILE
    テンポラリファイルを消す。お掃除




    HD-HGLAN 1.51 beta + USB HUB + MV7DX/U2
    ハックの記録
    LinkStation/玄箱 をハックしよう

    PC-MV7DX/U2 新ドライバ??

    Copyright (C) 2006 Yasunari Yamashita. All Rights Reserved.
    yasunari @ yamasita.jp 山下康成@京都府向日市