fork(2) download
  1. //設定
  2. var closeOnLinkClicked = true;//外部リンクをクリックした場合、ポップアップを閉じる
  3. var closeOnMouseExit = true;//ポップアップ上から離れた場合、ポップアップを閉じる
  4. var browseExt = false;//外部ブラウザで開く(falseだとJDICがあれば内部ブラウザで開く)
  5. var maxPopupWidth = 429;//ポップアップの最大横サイズ[px]、本来のhtmlサイズ調整用(0で調整なし、この場合、右に余分なスペース有)
  6. var addLinkNicoDic = false;//タグの後に、ニコニコ大百科のリンクを付加 ※ポップアップまでに時間がかかる場合があります(この場合、ステータスバーに「取得中...」が表示)
  7. var urlExec = true;// リンククリック時、URLExec.datの設定に従うかどうか
  8. var browserPath = false;//URLEcex.datの設定に従うときに使用する規定のブラウザのパス(「\」は「/」に置換してください)
  9.  
  10. //実行
  11. var vcx = v2c.context;
  12. var nvstream = '';
  13. GetStatus();
  14.  
  15. function redirectURL(u) {
  16. if (u) {
  17. if(!(urlExec && openURLExec(u)))
  18. browseExt ? v2c.browseURLExt(u) : v2c.browseURL(u);
  19. if(!closeOnLinkClicked){
  20. vcx.setPopupHTML(nvstream);
  21. if(closeOnMouseExit) vcx.setCloseOnMouseExit(true);
  22. if(maxPopupWidth) vcx.setMaxPopupWidth(maxPopupWidth);
  23. vcx.setRedirectURL(true);
  24. }
  25. }
  26. return;
  27. }
  28. function replaceStr(str,nl){
  29. if(nl) {
  30. str = str.replace(/((?:mylist|user)\/\d+)/ig, '<a href="http://w...content-available-to-author-only...o.jp/$1">$1</a>');
  31. str = str.replace(/([sn]{1}m\d+)/ig, '<a href="http://w...content-available-to-author-only...o.jp/watch/$1">$1</a>');
  32. }
  33. return str = str.replace(/&amp;/ig,"&").replace(/&apos;/ig,"'");
  34. }
  35. function replaceNum(num){
  36. return num = num.replace(/(\d)(?=(\d{3})+(?!\d))/g,"$1,");
  37. }
  38. function GetStatus(){
  39. //選択文字列のチェック
  40. var ss = (v2c.getSelectedText() || vcx.link || vcx.res.message)+"";
  41. if(ss){
  42. ss = ss.replace(/^\s+|\s+$/g, "");
  43. }
  44. if(!ss||(ss.length==0)){
  45. v2c.alert('テキスト取得失敗');
  46. return;
  47. }
  48.  
  49. //選択文字列からIDを抽出
  50. //”sm”などを含む以降の数値をIDとする
  51. var rgex = new RegExp('(?:\\?|/|#|)((?:ax|c[adw]|c[dw]|f[xz]|ig|n[alm]|om|s[dkm]|y[ko]|z[a-e]|so|)\\d+)');
  52. //var rgex = new RegExp('(?:(?:www|tw|es|de|m)\\.nicovideo.jp/watch|nico.ms)/(\\w{2}\\d+)');
  53. var video_id = (ss.match(rgex) || [])[1];
  54. if(!video_id){
  55. v2c.alert('ID取得失敗');
  56. return;
  57. }
  58. if(video_id.search(/^(lv|im)\d+/) > -1) return;
  59. if (vcx.getPopupOfID(video_id)) {
  60. vcx.closeOriginalPanel();
  61. return;
  62. }
  63. var url = 'http://e...content-available-to-author-only...o.jp/api/getthumbinfo/' + video_id;
  64. v2c.setStatus('動画情報、取得中...');
  65. var source = v2c.readURL(url);
  66. v2c.setStatus('');
  67. if (!source) {
  68. v2c.alert('ページを取得できませんでした。');
  69. return;
  70. } else if (source.indexOf('nicovideo_thumb_response status="fail"') > -1){
  71. if(source.indexOf('<code>DELETED</code>') > -1) {
  72. v2c.alert('この動画は削除されました。');
  73. } else {
  74. v2c.alert('動画を取得できませんでした。');
  75. }
  76. return;
  77. }
  78. //ステータスの変数宣言
  79. var title = " - ";
  80. var description = " - ";
  81. var all_description = " - ";
  82. var thumbnail_url = " - ";
  83. var first_retrieve = " - ";
  84. var length = " - ";
  85. var movie_type = " - ";
  86. var size_high = " - ";
  87. var kB_size_high = " - ";
  88. var MB_size_high = " - ";
  89. var size_low = " - ";
  90. var kB_size_low= " - ";
  91. var MB_size_low= " - ";
  92. var view_counter = " - ";
  93. var comment_num = " - ";
  94. var mulist_counter = " - ";
  95. var last_res_body = " - ";
  96. var watch_url = " - ";
  97. var thumb_type = " - ";
  98. var embeddable = "ー";
  99. var live_play = "ー";
  100. var jp_category_tag = "";
  101. var jp_lock_tag = "";
  102. var jp_free_tag = "";
  103. var jp_tag = "";
  104. var tw_tag = "";
  105. var de_tag = "";
  106. var es_tag = "";
  107. var user_id = "";
  108.  
  109. //タイトル取得
  110. if(source.match(/title>(.+?)<\/title>/i)){
  111. title = replaceStr(RegExp.$1);
  112. }
  113. //説明取得
  114. if(source.match(/description>(.+?)<\/description>/i)){
  115. description = replaceStr(RegExp.$1);
  116. all_description = replaceStr(description,true);
  117. if (description.length > 100) description = description.substring(0, 100)+'..';
  118. }
  119. //サムネイルのURL取得
  120. if(source.match(/thumbnail_url>(.+?)<\/thumbnail_url>/i)){
  121. thumbnail_url = RegExp.$1;
  122. }
  123. //投稿時間取得
  124. if(source.match(/first_retrieve>(.+?)<\/first_retrieve>/i)){
  125. var d= (RegExp.$1).match(/\d{2}/g);
  126. first_retrieve = d[1]+'/'+d[2]+'/'+d[3]+' '+d[4]+':'+d[5];
  127. }
  128. //再生時間取得
  129. if(source.match(/length>(.+?)<\/length>/i)){
  130. length = RegExp.$1;
  131. }
  132. //形式取得
  133. if(source.match(/movie_type>(.+?)<\/movie_type>/i)){
  134. movie_type = RegExp.$1;
  135. }
  136. //サイズ(高画質)取得
  137. if(source.match(/size_high>(.+?)<\/size_high>/i)){
  138. size_high = RegExp.$1;
  139. kB_size_high = (parseInt(size_high)/1024).toFixed(1);
  140. MB_size_high = (parseInt(kB_size_high)/1024).toFixed(2);
  141. }
  142. //サイズ(低画質)取得
  143. if(source.match(/size_low>(.+?)<\/size_low>/i)){
  144. size_low = RegExp.$1;
  145. kB_size_low = (parseInt(size_low)/1024).toFixed(1);
  146. MB_size_low = (parseInt(kB_size_low)/1024).toFixed(2);
  147. }
  148. //再生数取得
  149. if(source.match(/view_counter>(.+?)<\/view_counter>/i)){
  150. view_counter = replaceNum(RegExp.$1);
  151. }
  152. //コメント数取得
  153. if(source.match(/comment_num>(.+?)<\/comment_num>/i)){
  154. comment_num = replaceNum(RegExp.$1);
  155. }
  156. //マイリスト数取得
  157. if(source.match(/mylist_counter>(.+?)<\/mylist_counter>/i)){
  158. mylist_counter = replaceNum(RegExp.$1);
  159. }
  160. //最近のコメント取得
  161. if(source.match(/last_res_body>(.+?)<\/last_res_body>/i)){
  162. last_res_body = replaceStr(RegExp.$1);
  163. }
  164. //動画のURL取得
  165. if(source.match(/watch_url>(.+?)<\/watch_url>/i)){
  166. watch_url = RegExp.$1;
  167. }
  168. //通常かマイメモリか取得
  169. if(source.match(/thumb_type>(.+?)<\/thumb_type>/i)){
  170. thumb_type = RegExp.$1;
  171. }
  172. //外部からの埋め込み再生可否取得
  173. if(source.match(/embeddable>(.+?)<\/embeddable>/i)){
  174. embeddable = RegExp.$1 == "1" ? "○" : "×";
  175. }
  176. //生放送の引用可否取得
  177. if(source.match(/live_play>(.+?)<\/no_live_play>/i)){
  178. live_play = RegExp.$1 == "1" ? "×" : "○";
  179. }
  180. //日本タグ取得
  181. rgex = new RegExp('<tag.*?>([^><]+)','ig');
  182. rgex.lastIndex = source.indexOf('<tags domain="jp">')+1;
  183. var readDicApi = function( kw ) {
  184. v2c.setStatus('タグの大百科有無、取得中...');
  185. var dic = kw ? v2c.readURL('http://a...content-available-to-author-only...c.jp/e/n/' + kw) + '' : '';
  186. v2c.setStatus('');
  187. if(dic && dic.indexOf('1') > 0) {
  188. return '&nbsp;' + '<a href="http://d...content-available-to-author-only...o.jp/a/' + kw
  189. + '" class="dic_on">百</a>' + ' ';
  190. // + '"><img src="http://r...content-available-to-author-only...g.jp/img/common/icon/dic_on.png" alt="大百科" border="0"></a>' + ' '; //↑行と置換でアイコン表示、ただポップサイズが崩れる
  191. } else {
  192. return '&nbsp;' + '<a href="http://d...content-available-to-author-only...o.jp/a/' + kw
  193. + '" class="dic_off">?</a>' + ' ';
  194. // + '"><img src="http://r...content-available-to-author-only...g.jp/img/common/icon/dic_off.png" alt="大百科" border="0"></a>' + ' '; //↑行と置換でアイコン表示、ただポップサイズが崩れる
  195. }
  196. }
  197. var keyword = '';
  198. while(rgex.exec(source) != null){
  199. if(RegExp.lastMatch.indexOf('category') > -1) {
  200. keyword = encodeURIComponent(RegExp.lastParen);
  201. jp_category_tag += '<a href = "http://w...content-available-to-author-only...o.jp/tag/'
  202. + keyword + '" class="category_tag">' + RegExp.lastParen + '</a>';
  203. jp_category_tag += addLinkNicoDic ? readDicApi( keyword ) : ' ';
  204. } else if(RegExp.lastMatch.indexOf('lock') > -1) {
  205. keyword = encodeURIComponent(RegExp.lastParen);
  206. jp_lock_tag += '<a href = "http://w...content-available-to-author-only...o.jp/tag/'
  207. + keyword + '" class="lock_tag">' + RegExp.lastParen + '</a>';
  208. jp_lock_tag += addLinkNicoDic ? readDicApi( keyword ) : ' ';
  209. } else {
  210. keyword = encodeURIComponent(RegExp.lastParen);
  211. jp_free_tag += '<a href = "http://w...content-available-to-author-only...o.jp/tag/'
  212. + keyword + '" class="free_tag">' + RegExp.lastParen + '</a>';
  213. jp_free_tag += addLinkNicoDic ? readDicApi( keyword ) : ' ';
  214. }
  215. if(RegExp.rightContext.search(/^<\/tag>\n<\/tags>/i) == 0) break;
  216. }
  217. if(jp_category_tag == "") jp_category_tag = replaceStr(jp_category_tag);
  218. if(jp_lock_tag == "") jp_lock_tag = replaceStr(jp_lock_tag);
  219. if(jp_free_tag == "") jp_free_tag = replaceStr(jp_free_tag);
  220. jp_tag = jp_category_tag + jp_lock_tag + jp_free_tag;
  221. //台湾タグ取得
  222. rgex = new RegExp('<tag.*?>([^><]+)','ig');
  223. rgex.lastIndex = source.indexOf('<tags domain="tw">')+1;
  224. while(rgex.exec(source) != null){
  225. tw_tag += '<a href = "http://t...content-available-to-author-only...o.jp/tag/'
  226. + encodeURIComponent(RegExp.lastParen) + '">' + RegExp.lastParen + '</a>';
  227. if(RegExp.rightContext.search(/^<\/tag>\n<\/tags>/i) == 0) break;
  228. tw_tag += "&nbsp;";
  229. }
  230. //ドイツタグ取得
  231. rgex = new RegExp('<tag.*?>([^><]+)','ig');
  232. rgex.lastIndex = source.indexOf('<tags domain="de">')+1;
  233. while(rgex.exec(source) != null){
  234. de_tag += '<a href = "http://d...content-available-to-author-only...o.jp/tag/'
  235. + encodeURIComponent(RegExp.lastParen) + '">' + RegExp.lastParen + '</a>';
  236. if(RegExp.rightContext.search(/^<\/tag>\n<\/tags>/i) == 0) break;
  237. de_tag += "&nbsp;";
  238. }
  239. de_tag = replaceStr(de_tag);
  240. //スペインタグ取得
  241. rgex = new RegExp('<tag.*?>([^><]+)','ig');
  242. rgex.lastIndex = source.indexOf('<tags domain="es">')+1;
  243. while(rgex.exec(source) != null){
  244. es_tag += '<a href = "http://e...content-available-to-author-only...o.jp/tag/'
  245. + encodeURIComponent(RegExp.lastParen) + '">' + RegExp.lastParen + '</a>';
  246. if(RegExp.rightContext.search(/^<\/tag>\n<\/tags>/i) == 0) break;
  247. es_tag += "&nbsp;";
  248. }
  249. es_tag = replaceStr(es_tag);
  250. //ユーザーID取得
  251. if(source.match(/user_id>(.+?)<\/user_id>/i)){
  252. user_id = RegExp.$1;
  253. }
  254.  
  255. //htmlテンプレートの読み込み
  256. var fs = java.io.File.separator;
  257. nvstream = v2c.readFile(v2c.saveDir
  258. +fs+fs+'script'+fs+fs+'PopupStatusNicovideo'+fs+fs+'template.txt');
  259.  
  260. //パラメータの置換
  261. nvstream = nvstream.replaceAll("%video_id%",video_id);
  262. nvstream = nvstream.replaceAll("%title%",title);
  263. nvstream = nvstream.replaceAll("%description%",description);
  264. nvstream = nvstream.replaceAll("%all_description%",all_description);
  265. nvstream = nvstream.replaceAll("%thumbnail_url%",thumbnail_url);
  266. nvstream = nvstream.replaceAll("%first_retrieve%",first_retrieve);
  267. nvstream = nvstream.replaceAll("%length%",length);
  268. nvstream = nvstream.replaceAll("%movie_type%",movie_type);
  269. nvstream = nvstream.replaceAll("%size_high%",size_high);
  270. nvstream = nvstream.replaceAll("%kB_size_high%",kB_size_high);
  271. nvstream = nvstream.replaceAll("%MB_size_high%",MB_size_high);
  272. nvstream = nvstream.replaceAll("%size_low%",size_low);
  273. nvstream = nvstream.replaceAll("%kB_size_low%",kB_size_low);
  274. nvstream = nvstream.replaceAll("%MB_size_low%",MB_size_low);
  275. nvstream = nvstream.replaceAll("%view_counter%",view_counter);
  276. nvstream = nvstream.replaceAll("%comment_num%",comment_num);
  277. nvstream = nvstream.replaceAll("%mylist_counter%",mylist_counter);
  278. nvstream = nvstream.replaceAll("%movie_type%",movie_type);
  279. nvstream = nvstream.replaceAll("%last_res_body%",last_res_body);
  280. nvstream = nvstream.replaceAll("%watch_url%",watch_url);
  281. nvstream = nvstream.replaceAll("%thumb_type%",thumb_type);
  282. nvstream = nvstream.replaceAll("%embeddable%",embeddable);
  283. nvstream = nvstream.replaceAll("%live_play%",live_play);
  284. nvstream = nvstream.replaceAll("%jp_category_tag%",jp_category_tag);
  285. nvstream = nvstream.replaceAll("%jp_lock_tag%",jp_lock_tag);
  286. nvstream = nvstream.replaceAll("%jp_free_tag%",jp_free_tag);
  287. nvstream = nvstream.replaceAll("%jp_tag%",jp_tag);
  288. nvstream = nvstream.replaceAll("%tw_tag%",tw_tag);
  289. nvstream = nvstream.replaceAll("%de_tag%",de_tag);
  290. nvstream = nvstream.replaceAll("%es_tag%",es_tag);
  291. nvstream = nvstream.replaceAll("%user_id%",user_id);
  292.  
  293. //ポップアップ表示
  294. vcx.setPopupHTML(nvstream);
  295. if(closeOnMouseExit) vcx.setCloseOnMouseExit(true);
  296. if(maxPopupWidth) vcx.setMaxPopupWidth(maxPopupWidth);
  297. vcx.setRedirectURL(true);
  298. vcx.setPopupID(video_id);
  299. return;
  300. }
  301.  
  302. function openURLExec( url ) {
  303. var url = new java.lang.String( url );
  304. var fs = java.io.File.separator;
  305. var tmp = v2c.readFile( v2c.saveDir + fs + 'URLExec.dat', 'Shift-JIS' );
  306. if ( !tmp ) {
  307. v2c.println( 'URLExec.datが見つかりませんでした' );
  308. return false;
  309. }
  310. var lines = tmp.split( '\r\n' );
  311. var ptn = java.util.regex.Pattern.compile("^(?<!;|'|//)([^\t]+\t){2}[^\t]+$");
  312. for( var i=0,len=lines.length; i<len; i++ ) {
  313. var matcher = ptn.matcher(lines[i]);
  314. if ( matcher.matches() ) {
  315. //v2c.println( '有効行:' + matcher.group(0) );
  316. } else {
  317. //v2c.println( '!無効行:' + lines[i] );
  318. continue;
  319. }
  320.  
  321. var matchFlg = false;
  322. var item = lines[i].split( '\t' );
  323. if ( item.length != 3 ) { // 念のため
  324. v2c.println( 'Tabの数が不正:' + (item.length-1) );
  325. continue;
  326. }
  327. item[1] = (new java.lang.String(item[1])).replaceAll( '\\$&', '\\$0' );
  328.  
  329. try {
  330. var ptn2 = java.util.regex.Pattern.compile(item[0]);
  331. } catch( e ) { // 不正な正規表現を無視
  332. v2c.println( e );
  333. continue;
  334. }
  335. if ( ptn2.matcher(url).find() ) {
  336. matchFlg = true;
  337. url = url.replaceFirst( item[0], item[1] );
  338. break;
  339. }
  340. }
  341. if ( !matchFlg ) {
  342. v2c.println( 'URLExec.dat:マッチなし\n' + url );
  343. return false;
  344. }
  345.  
  346. var cmds = item[2].split( ' ' );
  347. if ( cmds.length == 0 ) {
  348. v2c.println( 'URLExec.dat:コマンドがありません' );
  349. return false;
  350. }
  351. for ( i=0; i<cmds.length; i++ ) {
  352. var matcher = java.util.regex.Pattern.compile('\\$VIEW').matcher(cmds[i]);
  353. if ( matcher.find() ) {
  354. if ( i==0 ){
  355. v2c.println( 'URLExec.dat:無効なキーワード"$VEIW"' );
  356. return false;
  357. }
  358. }
  359.  
  360. // $BROWSER
  361. if ( browserPath ) {
  362. cmds[i] = cmds[i].replaceAll( '\\$BROWSER', browserPath );
  363. } else {
  364. // ブラウザを指定していない場合で、更にURLExec.datのコマンドが、
  365. // ブラウザにURLを渡すだけの場合はデフォルト外部ブラウザで開く(応急処置)
  366. if( item[2].matches( '"?\\$BROWSER"? "?\\$(URL|LINK)"?' ) ) { //完全一致
  367. v2c.browseURLDefExt(url);
  368. v2c.println( 'cmd='+item[2] );
  369. return true;
  370. }
  371. }
  372.  
  373. // $LINK 置換しない場合は、この下の行をコメントアウト
  374. cmds[i] = cmds[i].replaceAll( '\\$LINK', url );
  375.  
  376. // $URL 置換しない場合は、この下行をコメントアウト
  377. cmds[i] = cmds[i].replaceAll( '\\$URL', url );
  378.  
  379. // $BASEPATH
  380. if ( i==0 ) { // コマンドの場合
  381. cmds[i] = cmds[i].replaceAll( '\\$BASEPATH', v2c.saveDir.toString()
  382. .replaceAll( '\\\\', '/' ) + '/' );
  383. } else { // 引数の場合
  384. cmds[i] = cmds[i].replaceAll( '\\$BASEPATH', v2c.saveDir.toString()
  385. .replaceAll( '\\\\', '\\\\\\\\' ) + '\\\\' );
  386. }
  387.  
  388. // $POSX $POSY
  389. var p = v2c.context.mousePos;
  390. if ( p ) {
  391. cmds[i] = cmds[i].replaceAll( '\\$POSX', p.x );
  392. cmds[i] = cmds[i].replaceAll( '\\$POSY', p.y );
  393. }
  394. v2c.println( 'cmd['+i+']='+cmds[i] );
  395. }
  396.  
  397. v2c.exec(cmds);
  398. return true;
  399. }
  400.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty