Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // JDownloader2 EventScript - 新規リンク登録時に同一タイトルでグループ化するスクリプト
- //
- // 【概要】
- //
- // 新規リンク登録時に名前の文字列内にある括弧を無視して
- // グループ化してパッケージに移動する
- //
- // 【説明】
- //
- // JDにURLを登録する際、カテゴリや作者名が違ったり無かったりすれば、
- // 同じタイトルであってもグループ化されず、別のパッケージに登録される。
- //
- // このスクリプトでは、リンクやパッケージの名前の()内、[]内を無視し
- // 他の部分が一致すれば一つのパッケージにグループ化します。
- // (カテゴリ名や作者名を無視する)
- //
- // 書庫ファイルや電子書籍ファイル、動画ファイルのみグループ化します
- // (zip,rar,cbz,cbr,pdf,epub,azw3,mp4,mkv,webm,avi,wmv)
- //
- // ※JDに登録する際に、常に命名規則に則った
- // 名前付けをしていることが前提
- //
- // 例:"(カテゴリ) [作者名] タイトル... .rar"
- //
- // ※意図しない動作になった場合を考え
- // このスクリプトではリンク名のリネームは行わない
- // パッケージ名変更とリンクの移動のみ行います
- //
- //
- // 【使い方】
- //
- // 『Synchronous execution of script』 OFF
- // Synchronous(同期)をオフ、
- // !!!非同期にしておかないとイベント時にJDが固まる!!!
- //
- // 『Trigger』 A new link has been added (ON_NEW_LINK)
- //
- //
- /*
- 新規に追加されたリンクの名前に基づいて
- 既存のパッケージ名、もしくはリンク名(※)の
- タイトル部分が同一であれば
- それらを含めてグループ化、つまり一つのパッケージにまとめる
- 最終パッケージ名
- 作者名(英数のみ)よりも作者名(英数以外含む)を優先して採用
- カテゴリはパッケージとリンクの名前から列挙し
- 優先順位に従って採用(category_listのリスト昇順)
- ※ 既存のリンクが対象となるのは
- 自動生成されたパッケージ内のリンクのみ
- */
- const category_list = [
- '18禁アニメ',
- '同人アニメ',
- '同人CG集',
- '同人誌',
- '成年コミック',
- '一般小説',
- '一般コミック・少女',
- '一般コミック',
- '一般書籍'
- ];
- ///////////////////////////////////////////////////////////////////////////
- function isTargetFileExt(n)
- {
- return /(?:^[^\.]+$)|(?:\.(?:rar|zip|7z|cbz|cbr|pdf|epub|azw3|mp4|mkv|webm|avi|wmv)$)/i.test(n);
- }
- function isAutoCreatedFolderName(n)
- {
- return n=='様々なファイル'||n=='任意'||n=='Folder'||n=='永続オフライン'||n=='オフラインファイル'
- }
- function getFileParts(f)
- {
- var r = f.match(/^(.+)(\.part\d+|\.mp3|\.zip|\.rar|\.tar|\.epub)?(\.[\da-z]{2,6})$/i);
- return r?[r[1]||'',r[2]||'',r[3]||'']:[f,'',''];
- }
- function getFileSpec(f){return (getFileParts(f))[0]}
- function getFileSpecFull(f){const x=getFileParts(f);return x[0]+x[1];}
- function getExt(f){return (getFileParts())[2]}
- function getExtFull(f){const x=getFileParts(f);return x[1]+x[2];}
- function comicNumbering(str)
- {
- return (isNaN(str)||str.length==2)?str:(str.length==1)?('0'+str):str.replace(/^0+(\d\d)$/,'$1');
- }
- function replaceNums(str)
- {
- return str.replace(/\d+/g,function(x){return comicNumbering(x);})
- }
- function K(k){return Object.keys(k)}
- //function truncateName(str)
- function tN(str)
- {
- return str
- .replace(/\[[^\]]+\]/g,'')
- .replace(/\([^\)]+\)/g, '')
- .replace(/【[^】]+】/g,'')
- .replace(/~[^~]+~/,'')
- .replace(/~([^ \d\.]+\b)( [^ \d\.]+\b)*/,'')
- .replace(/\b([-ー―-])[^\d\.]+\1\b/,'')
- .replace('[@@]COMIC ','')
- .replace(/全(\d+)巻/,function(m,m1){return '第01-'+comicNumbering(m1)+'巻'})
- // .replace(/zen(\d+)/,function(m,m1){return (m1.length==1?m1:'01-'+comicNumbering(m1))})
- // .replace(/\bv(\d+)/,'$1')
- .replace(/\u0073hit|ra\u0070e/gi, '') //for turbobit
- .replace(/[_ ]/g,'')
- .replace(/×/g,'x')
- .replace(/([!?#$%&+@、。!?#$%&+@、。])/g,'')
- }
- function mergePackagesWithSameTitle_for_crawledLink(c_link)
- {
- // 開始時に少し待機、JD自体が重い時のエラー予防
- const interval = 1*100;
- var limitcount = 50;
- while(limitcount-- > 0)
- if (sleep(interval) || c_link.package && c_link.package.name)
- break;
- if (c_link.package===null || c_link.package.name===null)
- return;
- const crawledLink_name_crafted = tN(getFileSpec(c_link.name));
- var i=0;
- var UUIDs = [], matched_names = [];
- //
- // 新規リンクの名前とマッチしたリンクのUUIDを取得
- // マッチしたパッケージ名とリンク名を取得
- //
- getAllCrawledPackages().forEach(function(p)
- {
- // 自動作成されたパッケージでは個々のリンク名を比較
- if (isAutoCreatedFolderName(p.name))
- p.downloadLinks.forEach(function(l)
- {
- if (isTargetFileExt(l.name)
- && crawledLink_name_crafted == tN(getFileSpec(l.name)))
- matched_names.push(getFileSpec(l.name)),
- UUIDs.push(l.UUID)
- });
- // 自動作成されたパッケージでなければパッケージ名を比較
- else if (crawledLink_name_crafted == tN(p.name))
- // 指定拡張子以外のリンクが含まれていれば除外
- if (! p.downloadLinks.some(function(l){return !isTargetFileExt(l.name)}))
- matched_names.push(p.name),
- UUIDs = Array.prototype.concat(UUIDs, p.downloadLinks.map(function(l){return l.UUID}));
- });
- // マッチしたものが2つ以上なければ終了
- if ((matched_names.length) <= 1)
- return;
- var final_author = '', final_category = '';
- var authors = {}, categorys = {};
- function incKey(o,k){k in o?o[k]++:(o[k]=1)};
- function setCategoryAndAuthor(name_str, category_dict, author_dict)
- {
- var r = name_str.match(/^(?:\(([^\)]+)\) *)?(?:\[([^\]]+)\] *)?/)
- if (!r) return;
- r[1] && incKey(category_dict,r[1]);
- r[2] && incKey(author_dict, r[2]);
- }
- matched_names.forEach(function(n){setCategoryAndAuthor(n,categorys,authors)});
- // 採用する作者名を取得
- // 英数のみ以外がある場合、英数のみのものは除外
- if (K(authors).length)
- {
- // var tmp1 = K(authors).sort(function(a,b){return authors[b]-authors[a]}); // 該当数順
- var tmp1 = K(authors).sort(function(a,b){return b.length - a.length}); // 作者名の長さ順
- var tmp2 = tmp1.filter(function(k){return ! /^[- _\.a-z\d]+$/i.test(k)});
- if (tmp2.length)
- {
- final_author = tmp2[0];
- // 除外すべき英数のみ作者名の名前がある
- if (tmp1.length != tmp2.length)
- matched_names = matched_names.filter(function(n){
- return ! /^(?:\([^\)]+\) *)?\[[- _\.a-z\d]+\]/i.test(n)});
- }
- else
- final_author = tmp1[0];
- }
- if (K(categorys).length)
- category_list.some(function(c){return (c in categorys) && (final_category = c)});
- // パッケージ名を選出
- // "(category) [authors] title..."
- // "[authors] title..."
- var dest_package_names = matched_names.filter(function(n){return /^\(([^\)]+)\) \[([^\]]+)\] .+/.test(n)})
- || matched_names.filter(function(n){return /^\[([^\]]+)\] .+/.test(n)});
- if (0==dest_package_names.length) return;//***
- var dest_package_name = dest_package_names[0];
- if (final_author)
- dest_package_name = dest_package_name.replace(/^(\([^\)]+\))? *\[[^\]]+\] */,
- function(m,m1){return (m1?(m1+' '):'')+'['+ final_author+'] '});
- if (final_category)
- dest_package_name = dest_package_name.replace(/^(\([^\)]+\))? */, '('+final_category+') ');
- callAPI('linkgrabberv2', 'movetoNewPackage', UUIDs, null, dest_package_name, null);
- }
- function waitForLinkCrawling(timeout_msec)
- {
- const polling_interval = 100;
- const timeout_min = polling_interval;
- const timeout_max = 5*60*1000;
- timeout_msec || (timeout_msec = timeout_max);
- var trycount = Math.max(Math.min(timeout_msec,timeout_max),timeout_min)
- /polling_interval;
- while(trycount-- > 0)
- if (! callAPI("linkcrawler","isCrawling")
- && ! callAPI("linkgrabberv2","isCollecting"))
- return true;
- return false;
- }
- disablePermissionChecks();
- if (isTargetFileExt(crawledLink.name))
- {
- // 取得できるjobがnullなので、jobが終えたかを個別で検知できない
- waitForLinkCrawling();
- const lock_key = "JD2.similar_title.lock";
- var glock = getModifyLock(lock_key);
- glock.writeLock();
- try {
- mergePackagesWithSameTitle_for_crawledLink(crawledLink);
- }
- finally
- {
- glock.writeUnlock();
- glock = null;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement