プレイリストの重複曲を考えてみる、その2。



foobar2000でいうと、まあ極端な例だが、こうなってほしいわけだ。

Image_computer/ddt.png

んでJscriptで関数を書いてみたわけだ。


//アクティブなプレイリストから重複するトラックを除去
// 2016/11/19 Junya Renno


//呼び出し
remove_duplicated_data();


function remove_duplicated_data(){
// 設定
var check1 = true; //同じtitle,かつ同じartist,同じdateの曲を除く
var check2 = true; //同じtitle,かつ同じartistで,違うdateの曲を除く
var check3 = true; //ほぼ同じtitle,かつ同じartistの曲を除く(instrumental,remix,var)
var check4 = true; //同じtitleで違うartistの曲を除く

// 初期化
var sorted_list = new Array;
var delete_items = new Array;
var tmp_title,tmp_artist,tmp_date;
var loc = plman.GetPlayingItemLocation();
var locitem = loc.PlaylistItemIndex;
var handles = plman.GetPlaylistItems(plman.ActivePlaylist);
var count = plman.PlaylistItemCount(plman.ActivePlaylist);
if (count <= 0) return;

// ActivePlaylistから比較用のデータを取り出す
for(var i=0; i<count; i++){
var pl_tf= fb.TitleFormat("%title% ^^ %artist% ^^ %date% ^^ %albumyear%").EvalWithMetadb(handles.item(i))
var pl_el = pl_tf.split(" ^^ ");
if (pl_el[2] == "?") pl_el[2] = pl_el[3];
pl_el[2] = pl_el[2].slice(0,4);
sorted_list[i] = [pl_el[0],i,pl_el[1],pl_el[2]];
}

// title&dateでソート
sorted_list.sort(function(a,b){
if(a[0]>b[0]) return 1;
if(a[0]<b[0]) return -1;
if(a[3]>b[3]) return 1;
if(a[3]<b[3]) return -1;
return 0;
});

// 実際の判定処理
for(var i=0; i<count; i++){
var re = new RegExp('^' + tmp_title,'i');
var re2 = new RegExp('instrumental| remix| version| mix|without vocals|backing track','i');
if (sorted_list[i][0] == tmp_title)
{
if (sorted_list[i][2] == tmp_artist)
{
if (check1 && sorted_list[i][3] == tmp_date)
{
fb.trace("check1 * "+sorted_list[i][0]+" "+sorted_list[i][2]+" "+sorted_list[i][3]);
delete_items.push(sorted_list[i][1]);
} else if(check2) {
fb.trace("check2 * "+sorted_list[i][0]+" "+sorted_list[i][2]+" "+sorted_list[i][3]);
delete_items.push(sorted_list[i][1]);
}
} else if (check4) {
fb.trace("check4 * "+sorted_list[i][0]+" "+sorted_list[i][2]+" "+sorted_list[i][3]);
delete_items.push(sorted_list[i][1]);
}
} else if (check3 && re.test(sorted_list[i][0]) && re2.test(sorted_list[i][0])) {
fb.trace("check3 * "+sorted_list[i][0]+" "+sorted_list[i][2]+" "+sorted_list[i][3]);
delete_items.push(sorted_list[i][1]);
} else {
tmp_title = sorted_list[i][0];
tmp_artist = sorted_list[i][2];
tmp_date = sorted_list[i][3];
}
}
// プールしておいた曲を選択し、除去
plman.SetPlaylistSelection(plman.ActivePlaylist, delete_items, true);
plman.RemovePlaylistSelection(plman.ActivePlaylist);
// plman.RenamePlaylist(plman.ActivePlaylist, plman.GetPlaylistName(plman.ActivePlaylist) + "-d");
sorted_list = null;

}


前回と場合分けが異なっているのに注意。
あー、これ関数だけだから、試したい場合は自作ボタンとかに組み込んでくれ。

オリジナルを機械的に判定するのは難しくて、暫定的にdateが一番古い曲をオリジナル認定している。
秋桜という曲は作詩作曲さだまさしなんだが、山口百恵に提供したのがオリジナルであってあとはセルフを含めカバーということになる。
けど世間一般「秋桜はさだまさしの曲」が浸透しちゃってるので、グレープ時代の一番古いバージョンをオリジナル認定するべきなのか。
ね、メンドクサイでしょ。

この関数で使っている俺ルールは
・dateが古い方がオリジナルに近い
・titleに続き「instrumental,remix,version,mix,without vocals,backing track」の文字があれば除去対象(異論は承知)
・同名異曲問題は棚上げ
である。


タグがしっかり打ってあるのは前提。



 

コメントは日本語でお願いします。(URLは入力禁止:Do not URL writing.) :System message: コメントを受けつけています。