この記事は DTV Advent Calendar 2015 15日目の記事です。
皆さん、TSのリネームはどうしていますか?
録画ファイルから直接情報を取得して、しょぼいカレンダーも合わせて利用できるリネーム出来るものを作りました。
概要
録画ファイルから情報を取得して、適切にリネームできるts-renamerを作りました。
具体的にはTSのEPGから情報を取得して、しょぼいカレンダーを経由してファイル名として設定するものです。
使い方
scripts/rename.batにファイルをドロップすると、リネームされます。
rename.batの
node "%~dp0../cli.js" -i "%~1" -d "${firstStartYYYY}_Q${firstStartQuarter}/${title}" -f "${title}([ 第${count2}話])([ 「${subTitle}」])([ (${channelUserName})])"
の1行を変えることで意図したリネーム結果を得られます。
-d “ディレクトリ名”
リネーム後のディレクトリです。デフォルトではタイトルになります。空白でディレクトリを作りません。
-f “ファイル名”
リネーム後のファイル名です。デフォルトではタイトル、話数、サブタイトル、ユーザー定義チャンネル名が含まれます。
-p “親フォルダ”
リネーム後の親フォルダです。空白で現在のフォルダが親フォルダになります。
設定
settings/settings.jsonを書き換えることで設定を変えることができます。
JSON形式ですので、メモ帳で編集するか、JSON Editor Onlineを使って編集してください。
replace
置換設定をすることができます。
{ "find": "TVアニメ", "replace": "" }
の場合は “TVアニメ”を””(空白)に置換します。
service
サービス(放送局名)の設定をすることができます。
{ "serviceName": "NHKBS1", "channelUserName": "BS1", "channelId": 9 }
の場合は、サービス名から”NHKBS1″を探して合致すれば、ユーザー定義チャンネル名(マクロで使えます)を”BS1″に設定し、しょぼいカレンダーのチャンネルIDを9とします。しょぼいカレンダーのチャンネルIDはこちらで見られます。
マクロ
ディレクトリ名とファイル名にはマクロが使えます。
また、([ ])で括られている場合、その中のマクロが存在しなかった場合は、括弧内を空白にする機能もあります。
- ${title} – タイトル
- ${shortTitle} – 短いタイトル(無い場合はタイトル)
- ${subTitle} – サブタイトル
- ${titleYomi} – タイトル(読み)
- ${titleEnglish} – タイトル(英語)
- ${count} – 話数
- ${count2} – 話数(2桁)
- ${count3} – 話数(3桁)
- ${count4} – 話数(4桁)
- ${firstStartYYYY} – 最速放送開始年
- ${firstStartYY} – 最速放送開始年(下2桁)
- ${firstStartM} – 最速放送開始月
- ${firstStartMM} – 最速放送開始月(2桁)
- ${firstStartQuarter} – 最速放送開始クォーター
- ${firstStartSeason} – 最速放送開始季節(春夏秋冬)
- ${firstEndYYYY} – 最速放送終了年
- ${firstEndYY} – 最速放送終了年(下2桁)
- ${firstEndM} – 最速放送終了月
- ${firstEndMM} – 最速放送終了月(2桁)
- ${firstEndQuarter} – 最速放送終了クォーター
- ${firstEndSeason} – 最速放送終了季節(春夏秋冬)
- ${YYYY} – 開始年
- ${YY} – 開始年(下2桁)
- ${M} – 開始月
- ${MM} – 開始月(2桁)
- ${D} – 開始日
- ${DD} – 開始日(2桁)
- ${h} – 開始時
- ${hh} – 開始時(2桁)
- ${m} – 開始分
- ${mm} – 開始分(2桁)
- ${s} – 開始秒
- ${ss} – 開始秒(2桁)
- ${_YYYY} – 終了年
- ${_YY} – 終了年(下2桁)
- ${_M} – 終了月
- ${_MM} – 終了月(2桁)
- ${_D} – 終了日
- ${_DD} – 終了日(2桁)
- ${_h} – 終了時
- ${_hh} – 終了時(2桁)
- ${_m} – 終了分
- ${_mm} – 終了分(2桁)
- ${_s} – 終了秒
- ${_ss} – 終了秒(2桁)
- ${channelName} – チャンネル名
- ${channelUserName} – ユーザー定義チャンネル名
ダウンロード
Windows: ts-renamer
OSXやLinuxはgithubのts-renamerをcloneしてください。
renamer.jsの
start: new Date(info.startTime.getTime() – 60 * 60 * 1000),
を
start: new Date(info.startTime.getTime() – 60 * 60 * 1000 * 24 * 7),
にすることで解決しました。1000掛けてるからミリ秒単位やろなーって。
昨日の時点でprintfデバッグしてCan’t find programになる場所を探って何が起こっているかを大体理解して最終的にカレンダーに載ってないという原因を突き止めていたのですが、そのたった数行上にその処理があるとは。ちょっと手を伸ばせば良かっただけなのに、灯台下暗しとはよく言ったものですね。
もうJavascriptなんて全然わからないものだから、=>なんか連想配列の参照演算子かなんかだと思って調べに調べて出てこなくて、やっと見つけたアロー関数とかいうモノを理解する所でショートしてしまっていました。
お騒がせしました。
おろ? 昨日は書き込めてなかったのでしょうか。失礼しました。
「AT-Xなどの再放送分を録画した際、Can’t find programとなってリネーム出来ない」
という報告を書き込ませていただいておりました。つもりだったのですがどうやら書き込めてなかったようです。
ちょっといじってみました。参考になりましたら幸いです。
初心者なのでクソみたいなコードで申し訳ないと断った上で投下
それとこの書き込みも消してしまって頂ければ幸いです長いので
— renamer.js.orig 2016-11-05 19:16:55 +0900
+++ renamer.js 2016-11-05 19:23:28 +0900
@@ -249,6 +249,9 @@
info.eventName = info.eventName.replace(/『(.+?)』/g, ” $1 “);
// Replace others
+ // toString()付けないと反映されないっぽい。よしんば反映された所でこれは
+ // getProgramで使われるから下手にユーザさんに置換させない方ががが
+ // その上output.fileには影響しないのでその辺りもどうなんでしょう
settings.replace.forEach(target => {
info.eventName = info.eventName.split(target.find).join(target.replace);
});
@@ -284,7 +287,7 @@
const syobocalJson = new syobocal.Json();
return syobocalRss2.request({
– start: new Date(info.startTime.getTime() – 60 * 60 * 1000),
+ start: new Date(info.startTime.getTime() – 60 * 60 * 1000 * 24 * 7),
end: new Date(info.startTime.getTime() + 60 * 60 * 1000),
usr: “node_syobocal”
}).then(programs => {
@@ -350,6 +353,15 @@
return new Promise(resolve => {
const program = this.program;
+ // Applying word(s) for replaces
+ // 多分これが望まれる処理のような
+ settings.replace.forEach(target => {
+ program.title = program.title.split(target.find.toString()).join(target.replace.toString());
+ if (program.subTitle !== null) {
+ program.subTitle = program.subTitle.split(target.find.toString()).join(target.replace.toString());
+ }
+ });
+
this.macro = {
title: program.title,
shortTitle: program.shortTitle || program.title,
@@ -407,7 +419,7 @@
setMacro() {
console.log(“Set Macro…”);
– return new Promise(resolve => {
+ return new Promise((resolve, reject) => {
let dir = this.replaceMacro(this.options.dir);
let file = this.replaceMacro(this.options.file);
@@ -429,6 +441,15 @@
console.log(` – dir : ${this.output.dir}`);
console.log(` – file: ${this.output.file}`);
+ // Don’t need to operating, this file is already renamed
+ // リネームした結果重複するのは確かにマズいけれど、
+ // 入力元と出力先のファイルパスが全く同じということは
+ // そもそも処理をする必要が無いワケで
+ if (path.resolve(this.options.input) === this.output.path) {
+ reject(new Error(“Already renamed.. nothing to do”));
+ return;
+ }
+
resolve();
});
}
お世話になります。
最速放送開始年月の情報をリネーム後の因子に使用可能なので
SCRenameから乗り換えを検討しています。
EDCBからの録画後自動バッチでの利用を想定していますが、
ts-renamerによってリネーム&移動された後のファイルのパスは取得可能でしょうか?
後続処理でエンコードなどを行うため、
リネーム後のファイルのありかを変数で引き渡したいです。
斉木楠雄のΨ難(第2期)シリーズをリネームしようとすると次のようなエラーがでます。
ENAMETOOLONG: name too long,
オリジナルの名前のまま等、回避する様なオプションなどはあるでしょうか?
ver1.4.1 でEDCB対応版で、録画終了後のbatにedcb.batを設定しましたが、上手く動いてくれません。
main.bat との違いを見て、SCRの変数をセットしないといけない様な気がするのですが、SRCには何を指定すれば良いのでしょうか?
scripts/rename.batが現在存在しないようなのですがどのファイルを使えばいいのでしょう?
rename.batはmain.batに置き換えられました。
全て変数(set=XXX)で設定するようです。
プロセスがうまくいかなかった?