Advertisement
usamimi2323

JDownloader2 EventScript - リネーム系アクション集用コンテキストメニュー自動設定

Oct 23rd, 2024 (edited)
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 10.76 KB | Source Code | 0 0
  1. /**
  2.  * JDownloader2 EventScript - リネーム系アクション集用メニュー自動設定
  3.  *
  4.  * リネーム系アクション集に対応したメニュー項目を
  5.  * JD2のコンテキストメニューに登録するEventScript
  6.  *
  7.  * 実行後は必ずJDを再起動し、
  8.  * 追加されたメニュー項目をメニュー管理画面から
  9.  * 適宜、移動・編集・削除してください
  10.  *
  11.  * 【必須環境】
  12.  * JD2 + WindowsScriptHosting(WSH)
  13.  *
  14.  * ※WSHは確認メッセージボックスに使用
  15.  *   use_WSH=false とすれば不要、
  16.  *   その場合は確認なしにインポートと再起動が行われる
  17.  *
  18.  *
  19.  * 【使い方】
  20.  *
  21.  * 0. [WEBで検索]部分(161行目から172行目辺り)を自分用に書き換える
  22.  *
  23.  * 1. [設定]→[イベントスクリプト]→[+追加]ボタンを押す
  24.  *    →追加された項目の[編集]ボタンを押す
  25.  *   (※ ここで追加した無名スクリプトは、後で削除してください)
  26.  *
  27.  * 2. このスクリプトファイルの内容を全てコピーして貼り付ける
  28.  *
  29.  * 3. [試行]ボタンを押す
  30.  *
  31.  * 4. 登録したいメニューで「はい」を選ぶ
  32.  *
  33.  * 5. JD2を再起動
  34.  *
  35.  * 6. ダウンロードリスト画面、リンクグラバー画面
  36.  *    それぞれのメニュー管理画面から好きなように編集
  37.  *
  38.  *
  39.  */
  40.  
  41. const separator_name='セパレータ';
  42. const use_WSH = true;
  43. //const use_WSH = false;
  44.  
  45. /**
  46.  * @typedef {object} menuItem
  47.  * @prop {string} name メニュー名
  48.  * @prop {string} [iconKey=null] アイコン名
  49.  * @prop {string} [shortcut=null] ショートカットキー
  50.  * @prop {menuItem[]} [items] サブメニューのmenuItem配列
  51.  * ----------------------------------
  52.  * @prop {string} [type]
  53.  * @prop {string} [className]
  54.  * @prop {object} [actionData={}]
  55.  * @prop {string} [mnemonic=null]
  56.  * @prop {boolean} [visible=true]
  57.  */
  58.  
  59. /** @type {menuItem[]} 追加するメニューデータ 編集可 */
  60. var menu_items =
  61. [
  62.     {"name":separator_name},
  63.     {
  64.         "name":"リネーム - ファイル名を揃える",
  65.         "iconKey":"edit",
  66.         "items":[
  67.             {"name":"パッケージ名でファイル名を揃える"},
  68.             {"name":"このファイル名でパッケージ内を全て揃える"},
  69.             {"name":separator_name},
  70.             {"name":"名前を揃える"},
  71.             {"name":"名前を揃える(作者名)"},
  72.             {"name":"名前を揃える(タイトル)"},
  73.             {"name":"名前を揃える(カテゴリ+作者名)"},
  74.             {"name":"名前を揃える(カテゴリ+作者名+タイトル)"},
  75.             {"name":separator_name},
  76.             {"name":"[]内のスワップ"},
  77.             {"name":"[]内の末尾切り捨て"},
  78.             {"name":"[]内のxを×に変換"},
  79.             {"name":separator_name},
  80.             {"name":"第○○巻化"},
  81.             {"name":"連番桁揃え"},
  82.             {"name":separator_name},
  83.             {"name":"先頭括弧を後方送り"},
  84.             {"name":"末尾の括弧削除"}
  85.         ]
  86.     },
  87.     {
  88.         "name":"リネーム - 修正/追加/置換",
  89.         "iconKey":"edit",
  90.         "items":[
  91.             {"name":"(一般コミック) >>"},
  92.             {"name":"(一般コミック・少女) >>"},
  93.             {"name":"(一般コミック) [雑誌] >>"},
  94.             {"name":"(一般小説) >>"},
  95.             {"name":"(一般書籍) >>"},
  96.             {"name":"(成年コミック) >>"},
  97.             {"name":"(成年コミック) [雑誌] >>"},
  98.             {"name":"(同人誌) >>"},
  99.             {"name":"(同人CG集) >>"},
  100.             {"name":"(18禁アニメ) >>"},
  101.             {"name":separator_name},
  102.             {"name":"<< 別スキャン"},
  103.             {"name":"<< 単行本"},
  104.             {"name":"<< 透かし有り"},
  105.             {"name":"<< 寄せ集め"}
  106.         ]
  107.     },
  108.     {
  109.         "name":"移動/ファイル/再登録",
  110.         "iconKey":"folder_add",
  111.         "items":[
  112.             {"name":"この名前を使用して新しいパッケージに移動", "iconKey":"folder_add"},
  113.             {"name":"同じ名前のパッケージをまとめる"},
  114.             {"name":"リンクを同じ名前のパッケージに移動"},
  115.             {"name":separator_name},
  116.             {"name":"タイトルで並べ替え(昇順)"},
  117.             {"name":"タイトルで並べ替え(降順)"},
  118.             {"name":"作者名で並べ替え(昇順)"},
  119.             {"name":"作者名で並べ替え(降順)"},
  120.             {"name":separator_name},
  121.             {"name":"リンクグラバーへ再登録","iconKey":"linkgrabber"},
  122.             {"name":separator_name},
  123.             {"name":"JDバックアップフォルダを開く"},
  124.             {"name":"登録元ページを開く","iconKey":"search"}
  125.  
  126.         ]
  127.     },
  128.     {
  129.         "name":"有効/無効",
  130.         "iconKey":"checkbox_true",
  131.         "items":[
  132.             {"name":"優先ホスト以外を無効"},
  133.             {"name":separator_name},
  134.             {"name":"frdl.to以外を無効"},
  135.             {"name":"dailyuploads.net以外を無効"},
  136.             {"name":"dashfile.net以外を無効"},
  137.             {"name":"btafile.com以外を無効"},
  138.             {"name":separator_name},
  139.             {"name":"uploadbank.netを無効"},
  140.             {"name":"rosefile.netを無効"}
  141.         ]
  142.     },
  143.    
  144.     {
  145.         "name":"EveryThingで検索(作者名)",
  146.         "iconKey":"search",
  147.         "shortcut"  :"pressed F1"
  148.     },
  149.     {
  150.         "name":"EveryThingで検索(タイトル)",
  151.         "iconKey":"search",
  152.     },
  153.     {
  154.         "name":"ブラウザで開く",
  155.         "iconKey":"search"
  156.     },
  157.     {
  158.         "name":"WEBで検索",
  159.         "iconKey":"url",
  160.         "items":[
  161.             {"name":"888**.ps"},
  162.             {"name":"x***.net"},
  163.             {"name":"*****.se"},
  164.             {"name":"bs***.com"},
  165.             {"name":"raw*****.cc"},
  166.             {"name":separator_name},
  167.             {"name":"******core.com"},
  168.             {"name":"******omg.com"},
  169.             {"name":"n******.net"},
  170.             {"name":separator_name},
  171.             {"name":"google.com (作者)"},
  172.             {"name":"google.com (タイトル)"}
  173.         ]
  174.     }
  175. ];
  176.  
  177. /////////////////////////////////////////////////
  178.  
  179. /**
  180.  * メニューデータを再構築
  181.  *
  182.  * @param {menuItem|menuItem[]} x メニューデータ
  183.  */
  184. function rebuildMenu(x)
  185. {
  186.     function r(m)
  187.     {
  188.         // Set default value
  189.         if (! ('visible' in m)) m['visible']  = true;
  190.         if (! ('shortcut'in m)) m['shortcut'] = null;
  191.         if (! ('mnemonic'in m)) m['mnemonic'] = null;
  192.         if (! ('iconKey' in m)) m['iconKey']  = null;
  193.        
  194.         if (('items' in m) && m['items'].length)
  195.         {
  196.             m['type'] = 'CONTAINER';
  197.             m['className'] = 'org.jdownloader.controlling.contextmenu.MenuContainer';
  198.             m['actionData'] = {};
  199.            
  200.             m['items'].forEach(function(val,idx,list){
  201.                 r(list[idx]);
  202.             });
  203.         }
  204.         else if (m['name']==separator_name)
  205.         {
  206.             m['type'] = 'ACTION';
  207.             m['className'] = 'org.jdownloader.controlling.contextmenu.SeparatorData';
  208.             m['actionData'] = {};
  209.             m['items'] = [];
  210.         }
  211.         else
  212.         {
  213.             m['type'] = 'ACTION';
  214.             m['className'] = null;
  215.             if (!('actionData' in m))
  216.                 m['actionData'] = {'clazzName':'org.jdownloader.extensions.eventscripter.GenericEventScriptTriggerContextMenuAction'};
  217.             m['items'] = [];
  218.         }
  219.        
  220. //      if (m['visible']) true;
  221.     }
  222.     if (Array.isArray(x))
  223.         x.forEach(function(val,idx,list){r(list[idx])});
  224.     else
  225.         (r)(x);
  226. }
  227. /**
  228.  * コンテキストに応じたルートメニューを取得する
  229.  *
  230.  * @param {"DownloadTableContext"|"LinkgrabberContext"} context コンテキスト
  231.  * @returns {menuItem} ルートメニューデータ(JSON)
  232.  */
  233.  
  234. function getRootContextMenu(context)
  235. {
  236.     var storage = "cfg/menus_v2/" + context;
  237.     var interface = "org.jdownloader.controlling.contextmenu.ContextMenuConfigInterface";
  238.     var root_menu = callAPI(
  239.         "config", "get",
  240.         interface,
  241.         storage,
  242.         "menu"
  243.     );
  244.    
  245.     return root_menu;
  246. }
  247.  
  248. /**
  249.  * メニューデータをルートとして、コンテキストに応じたメニューに設定する
  250.  * (設定の反映にはJDの再起動が必要)
  251.  *
  252.  * @param {menuItem} x メニューデータ
  253.  * @param {"DownloadTableContext"|"LinkgrabberContext"} context コンテキスト
  254.  * @returns {boolean} 成功か失敗か
  255.  */
  256. function setRootContextMenu(root_menu, context) {
  257.     var storage = "cfg/menus_v2/"+context;
  258.     var interface = "org.jdownloader.controlling.contextmenu.ContextMenuConfigInterface";
  259.     return callAPI(
  260.         "config", "set",
  261.         interface,
  262.         storage,
  263.         "menu",
  264.         root_menu
  265.     );
  266. }
  267.  
  268. /**
  269.  * メニューデータをコンテキストに応じたルートメニューに追加して設定する
  270.  * (設定の反映にはJDの再起動が必要)
  271.  *
  272.  * @param {menuItem|menuItem[]} menu_items メニューデータ
  273.  * @param {"DownloadTableContext"|"LinkgrabberContext"} context コンテキスト
  274.  * @returns {boolean} 成功か失敗か
  275.  */
  276. function addMenuToContextMenu(menu_items, context)/* context = "DownloadTableContext" | "LinkgrabberContext" */
  277. {
  278.     const c = context||"DownloadTableContext";
  279.    
  280.     /** @type {menuItem} ルートメニュー取得 */
  281.     const root_container = getRootContextMenu(c);
  282.     if (root_container && root_container.type=='CONTAINER' && Array.isArray(root_container.items))
  283.     {
  284.         if (Array.isArray(menu_items))
  285.             menu_items.forEach(function(menu_item){root_container.items.push(menu_item);});
  286.         else
  287.             root_container.items.push(menu_items);
  288.        
  289.         setRootContextMenu(root_container, c);
  290.     }
  291. }
  292.  
  293. function _T(s)
  294. {
  295.     return (s===undefined||s===null)?'':s;
  296. }
  297. /**
  298.  * WSHを利用し確認メッセージボックスを表示して結果を得る
  299.  *
  300.  * @param {string|null} message メッセージボックスのメッセージ
  301.  * @param {string|null} title   メッセージボックスのタイトル
  302.  * @returns {bool} ユーザーの操作によって「はい」が選択されたならtrue
  303.  *    それ以外ならfalse
  304.  */
  305. function ConfirmBox(message, title)
  306. {
  307.     var ret = "";
  308.     var created = false;
  309.     const rand_str = Math.random().toString(36).slice(-8);
  310.    
  311.     // TEMPフォルダにJSファイルを作成し、cscript.exeで実行
  312.     const tempdir = getEnv("TEMP");
  313.     const tempfile = tempdir+"\\"+"JD_confirm_"+rand_str+".js";
  314.     const scriptdata =
  315.         'var a=WScript.Arguments;if(0<a.Count()){var t="",m=a.Item(0);'
  316.         +'1<a.Count()&&(t=a.Item(1));var s=new ActiveXObject("WScript.Shell");'
  317.         +'1==s.Popup(m,-1,t,33)&&WScript.StdOut.Write("OK");s=null};';
  318.     const f = getPath(tempfile);
  319.     try
  320.     {
  321.         if (f.exists())
  322.         {
  323.             f.deleteFile(tempfile,false);
  324.         }
  325.         writeFile(tempfile, scriptdata, false);
  326.         created = true;
  327.         ret = callSync('cscript.exe',"//NOLOGO",tempfile,_T(message),_T(title));
  328.     }
  329.     catch(e)
  330.     {
  331.     }
  332.     finally
  333.     {
  334.         if (created) deleteFile(tempfile,false);
  335.     }
  336.     return ret=="OK";
  337. }
  338.  
  339.  
  340. rebuildMenu(menu_items);
  341.  
  342. var restart_f = 0;
  343.  
  344. if ((!use_WSH) || ConfirmBox("ダウンロードリストのコンテキストメニューにメニューを追加します\r\nよろしいですか?","確認"))
  345.     addMenuToContextMenu(menu_items, "DownloadTableContext") || restart_f++;
  346.    
  347. if ((!use_WSH) || ConfirmBox("リンクグラバーのコンテキストメニューにメニューを追加します\r\nよろしいですか?","確認"))
  348.     addMenuToContextMenu(menu_items, "LinkgrabberContext") || restart_f++;
  349.  
  350.  
  351. if ((!use_WSH) || restart_f && ConfirmBox("設定の反映にはJDownloaderの再起動が必要です\r\n今すぐ再起動しますか?","JD再起動確認"))
  352.     callAPI("system","restartJD");
  353.  
  354.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement