// ==UserScript== // @name nicovideo - wnp // @description windowised nicovideo player. // @author miya2000 // @namespace http://d.hatena.ne.jp/miya2000/ // @version 1.53 // @include http://*.nicovideo.jp/* // @exclude http://www.nicovideo.jp/watch/* // @exclude http://*http* // @exclude http://ads.nicovideo.jp/* // @grant none // ==/UserScript== /* [usage] Open http://www.nicovideo.jp/ and you can start with the right-bottom button on the page. @see http://d.hatena.ne.jp/kotas/20070925/playlist http://abc.s65.xrea.com/prox/wiki/%A5%D5%A5%A3%A5%EB%A5%BF%A1%A2%A5%EA%A5%B9%A5%C8%B8%F8%B3%AB/nicovideo/#iroiro http://blog.fulltext-search.biz/articles/2008/01/31/nico-nico-player-wrapper http://blog.guron.net/2009/06/04/636.php */ // ==== preparation ==== // /*@cc_on //activate Conditional compilation. @*/ (function(f) { if (typeof unsafeWindow == "undefined" && !/Chrome[/]/.test(navigator.userAgent)) return f; return function() { var s = document.createElement('script'); s.setAttribute('type', 'text/javascript'); s.setAttribute('style', 'display: none;'); s.textContent = '(' + f.toString() + ')()'; (document.body || document.documentElement).appendChild(s); }; }) // ==== wnp ==== // (function() { if (typeof window.wnp != 'undefined') return; // Opera12 invokes user.js on window.open() document. if (document.title == 'preparing WNP') return; var WNP = {}; // ==== Prefs ==== // WNP.PREFS = { /* observe_interval : 500, // (ms) observe interval. page_timeout : 80, // (sec) page load timeout. video_timeout : 60, // (sec) video play timeout. menu_width_ratio : 50, // (%) menu width ratio when showing menu. loop : false, // "loop" on startup. comment_off : false, // "comment-off" on startup. always_on_top : false, // "always on top" on startup. playlist_style_simple : false, // "playlist style simple" on startup. remove_on_finish : true, // "remove on finish" on startup. use_history : true, // "use history" on startup. skip_deleted_video : true, // "skip deleted movie" on startup. use_offtimer : true, // use offtimer or not. offtimer_minute : 60, // (min) off timer. use_loop_break : true, // use loop break or not. loop_break_count : 3 // exit from the loop video by specified count. cancel_jump : false // if the video page jumped to another page, go to next video. */ }; // ==== shortcut keys ==== // WNP.SHOPRTCUT = [ /* { command: 'PlayPause', key: 'Space' }, { command: 'PlayPrev', key: 'PageUp' }, { command: 'PlayNext', key: 'PageDown' }, { command: 'VolumeUp', key: 'Up' }, { command: 'VolumeUp+', key: 'Up Shift' }, { command: 'VolumeDown', key: 'Down' }, { command: 'VolumeDown-', key: 'Down Shift' }, { command: 'SeekForward', key: 'Right' }, { command: 'SeekForward+', key: 'Right Shift' }, { command: 'SeekBackward', key: 'Left' }, { command: 'SeekBackward-', key: 'Left Shift' }, { command: 'SeekBackward--', key: 'Left Ctrl' }, { command: 'SelectNextItem', key: 'j' }, { command: 'SelectNextItem', key: 'Enter' }, { command: 'SelectPrevItem', key: 'k' }, { command: 'PlaySelectedItem', key: 'o' }, { command: 'DeleteSelectedItem', key: 'DEL' }, { command: 'MenuNext', key: 's' }, { command: 'MenuPrev', key: 'a' }, { command: 'Playlist', key: 'n' }, { command: 'History', key: 'h' }, { command: 'Preference', key: 'p' }, { command: 'Comment', key: 'c' }, { command: 'Loop', key: 'l' }, { command: 'Repeat', key: 'r' }, { command: 'Mute', key: 'm' }, { command: 'Open', key: 'w' }, { command: 'View', key: 'v' } */ ]; // ==== const ==== // var Consts = { WNP_TITLE : 'WNP', WNP_GLOBAL_NAME : 'WNP', // global name of WNP entry object. WNP_IMAGE_SAVE : 'data:image/gif;base64,R0lGODlhEAAQAIAAAAAAAPD4%2FyH5BAEAAAAALAAAAAAQABAAAAIhhI%2Bpq%2BEPHYo0zAovlscy4BnhMo7N9IHoV6Ytq23pTAMFADs%3D', WNP_IMAGE_PLAY : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAAt0lEQVQ4y2NgoCL4%2F%2F8%2FXnnB0NBQFyAtQA0DJVatWtUPVHALRAP5kpQaqAmUvAzE%2F4D4OxDvB4rZAzE7uQZqASWvQA2EgSchISG5oKAgy4X%2F%2Fv27DMR%2Fgfg%2FDAPBm5UrV07AFQSkuvA%2FoSAgx0BkcAnkE3K8jAxgXn8CTFL56OFJjgvxxjipBr4BpskJ%2BNIkPgO1gV67geZFvEmGkIFKQMntQPyB2ERNTF6WAnoxjdhsR4yBZJU2AAcDLeBOG3M7AAAAAElFTkSuQmCC', WNP_IMAGE_PAUSE : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAAe0lEQVQ4y2NgoCL4%2F%2F8%2FfgWhoaFuxIgRYyDLqlWrooAKfoJoEB%2BHGCOxBnIAJTf9h4BNID4OsYEzkP3fv38b%2F0HARhAfhxjDqJeHsJc5gN7aAdIJomEGYhEj2stsQMl2UGCBaBAfhxjRLgQDYBZrICBGmoG4NOISAxkIAIbuKTCbOZywAAAAAElFTkSuQmCC', WNP_IMAGE_EMPTY : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQI12P4DwQACfsD%2FWMmxY8AAAAASUVORK5CYII%3D', WNP_IMAGE_PREF : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAOUlEQVQoz2NgoCbg4uIC0x9%2B%2FP%2BPjInSTHVNeA3Bp4lojTCFRDkbXSNR%2Fh1YTSQHP20jm%2Bg4ohYAAAU6%2FYWVfvgIAAAAAElFTkSuQmCC', WNP_IMAGE_OPEN : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAABKklEQVQ4y2NgoCL4%2F%2F8%2FYUWcnJwywcHBeQoKCmYUG8jFxcU3c%2BbMJUCF%2Fy9cuHBFTk5OnxIDuZcuXTrlPxI4e%2FbsQVkgIMdApoULF84BKvjx79%2B%2F%2F0D87%2B%2Ffv%2F9Ahp45c2YLIyOjPCkGMl%2B5cmUe0ICfQPwfZiDITBAbCH7fv3%2F%2FJFCdIkED%2Bfj4GC9evMjw9u3b%2F1jwP2T%2Bu3fvfsrIyOA30NHRkQFoO8ObN2%2BIws3NzYS9DLLV3d2dKEzQyyAXrlq1Kg1o%2B1MofoTEfgxjv3r16jmQvgVSS9CFK1euTANKfAeFPjQS%2FkPZ%2F5DYILwfpJaggSBbQXpA%2BC8omrGwoWZ%2FQHchVgB14WUQBmq8jIN9A0hvR3chVgC0FURpArEWEo3O1gZiJQZ6AAC9TX6jYSwl0gAAAABJRU5ErkJggg%3D%3D', WNP_THUMB_PLACEHOLDER : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAAyCAIAAACMIyF9AAAAVklEQVRo3u3PAQkAMAwDsPt3OQeXcAuDwhgnFdA2p3q5QSpIp%2F8wMDAwMDAwMDD8b1jyI9llYGBgYGBgYGBgYGBgYBg3LPmR7DIwMDAwMDAwMDAwzBgeCliYGam%2FHsoAAAAASUVORK5CYII%3D', WNP_STORAGE_SWF : 'http://miya2000.github.io/storage/wnp.swf', WNP_INITIAL_PLAYER_WIDTH : 628, WNP_INITIAL_PLAYER_HEIGHT : 410, // == ginza player == ORG_PLAYER_GINZA_COMMENT_HEIGHT : 30, ORG_PLAYER_GINZA_CONTROL_HEIGHT : 47, // == zero player == ORG_PLAYER_ZERO_VIEW_WIDTH : 908, ORG_PLAYER_ZERO_VIEW_HEIGHT : 486, ORG_PLAYER_ZERO_CONTROL_HEIGHT : 0, ORG_PLAYER_ZERO_MINIMUM_WIDTH : 654, // 640 in case of Windows but 654 in Macintosh... ORG_PLAYER_ZERO_4_3_WIDTH_ADJ : 0, // == nicoplayer4 == ORG_PLAYER4_VIEW_WIDTH : 672, ORG_PLAYER4_VIEW_HEIGHT : 384, ORG_PLAYER4_CONTROL_HEIGHT : 51, ORG_PLAYER4_MINIMUM_WIDTH : 677, ORG_PLAYER4_4_3_WIDTH_ADJ : 120, // == nicoplayer3 (old player) == ORG_PLAYER3_VIEW_WIDTH : 544, ORG_PLAYER3_VIEW_HEIGHT : 384, ORG_PLAYER3_CONTROL_HEIGHT : 63, ORG_PLAYER3_MINIMUM_WIDTH : 561, WNP_GATEWAY_URL : 'http://www.nicovideo.jp/mylist_add/', WNP_LOGIN_PAGE : 'https://secure.nicovideo.jp/secure/login_form' } WNP.Consts = Consts; Consts.svg_xml_base = [ '', '' ].join('\n'); Consts.svg_mime_type = 'image/svg+xml'; // ==== color settings ==== // var Colors = { item_hover: '#D7EBFF', item_selected: '#B4DAFF', item_dragging: '#FFCCCC', status_error: 'red', control_loop: 'yellow', control_repeat: 'yellow', control_comment_off: 'yellow', control_mute: 'yellow', control_always_on_top: 'yellow' }; WNP.Colors = Colors; var Lang = { COMMAND_PlayStop : '\u52D5\u753B\u306E\u518D\u751F\u3092\u958B\u59CB\uFF0F\u7D42\u4E86\u3057\u307E\u3059\u3002', COMMAND_PlayPause : '\u52D5\u753B\u306E\u518D\u751F\u3092\u4E00\u6642\u505C\u6B62\uFF0F\u518D\u958B\u3057\u307E\u3059\u3002', COMMAND_PlayPrev : '\u4E00\u3064\u524D\u306E\u52D5\u753B\u3092\u518D\u751F\u3057\u307E\u3059\u3002', COMMAND_PlayNext : '\u4E00\u3064\u5F8C\u306E\u52D5\u753B\u3092\u518D\u751F\u3057\u307E\u3059\u3002', CLICK_Volume : '\u30AF\u30EA\u30C3\u30AF\u3057\u305F\u4F4D\u7F6E\u306B\u97F3\u91CF\u3092\u8A2D\u5B9A\u3057\u307E\u3059\u3002', COMMAND_VolumeUp : '\u97F3\u91CF\u3092\u4E0A\u3052\u307E\u3059\u3002', COMMAND_VolumeUp_Plus : '\u97F3\u91CF\u3092\u5927\u304D\u304F\u4E0A\u3052\u307E\u3059\u3002', COMMAND_VolumeDown : '\u97F3\u91CF\u3092\u4E0B\u3052\u307E\u3059\u3002', COMMAND_VolumeDown_Minus : '\u97F3\u91CF\u3092\u5927\u304D\u304F\u4E0B\u3052\u307E\u3059\u3002', CLICK_Seek : '\u30AF\u30EA\u30C3\u30AF\u3057\u305F\u7B87\u6240\u306B\u518D\u751F\u4F4D\u7F6E\u3092\u79FB\u52D5\u3057\u307E\u3059\u3002', COMMAND_SeekForward : '\u518D\u751F\u4F4D\u7F6E\u3092\u524D\u65B9\u306B\u79FB\u52D5\u3057\u307E\u3059\u3002', COMMAND_SeekForward_Plus : '\u518D\u751F\u4F4D\u7F6E\u3092\u524D\u65B9\u306B\u5927\u304D\u304F\u79FB\u52D5\u3057\u307E\u3059\u3002', COMMAND_SeekBackward : '\u518D\u751F\u4F4D\u7F6E\u3092\u5F8C\u65B9\u306B\u79FB\u52D5\u3057\u307E\u3059\u3002', COMMAND_SeekBackward_Minus : '\u518D\u751F\u4F4D\u7F6E\u3092\u5F8C\u65B9\u306B\u5927\u304D\u304F\u79FB\u52D5\u3057\u307E\u3059\u3002', COMMAND_SeekBackward_MinusMinus : '\u518D\u751F\u4F4D\u7F6E\u3092\u52D5\u753B\u306E\u5148\u982D\u306B\u79FB\u52D5\u3057\u307E\u3059\u3002', COMMAND_SelectNextItem : '\u4E00\u3064\u5F8C\u306E\u52D5\u753B\u3092\u9078\u629E\u72B6\u614B\u306B\u3057\u307E\u3059\u3002', COMMAND_SelectPrevItem : '\u4E00\u3064\u524D\u306E\u52D5\u753B\u3092\u9078\u629E\u72B6\u614B\u306B\u3057\u307E\u3059\u3002', COMMAND_PlaySelectedItem : '\u9078\u629E\u3055\u308C\u3066\u3044\u308B\u52D5\u753B\u3092\u518D\u751F\u3057\u307E\u3059\u3002', COMMAND_DeleteSelectedItem : '\u9078\u629E\u3055\u308C\u3066\u3044\u308B\u52D5\u753B\u3092\u524A\u9664\u3057\u307E\u3059\u3002', COMMAND_Menu : '\u30E1\u30CB\u30E5\u30FC\u306E\u8868\u793A\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', COMMAND_MenuNext : '\u6B21\u306E\u30E1\u30CB\u30E5\u30FC\u3092\u8868\u793A\u3057\u307E\u3059\u3002', COMMAND_MenuPrev : '\u524D\u306E\u30E1\u30CB\u30E5\u30FC\u3092\u8868\u793A\u3057\u307E\u3059\u3002', COMMAND_Playlist : '\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u306E\u8868\u793A\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', COMMAND_History : '\u8996\u8074\u5C65\u6B74\u306E\u8868\u793A\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', COMMAND_Preference : '\u8A2D\u5B9A\u753B\u9762\u306E\u8868\u793A\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', COMMAND_Comment : '\u30B3\u30E1\u30F3\u30C8\u306E\u8868\u793A\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', COMMAND_Loop : '\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u3092\u7E70\u308A\u8FD4\u3057\u518D\u751F\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', COMMAND_Repeat : '\u52D5\u753B\u3092\u7E70\u308A\u8FD4\u3057\u518D\u751F\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', COMMAND_Mute : '\u52D5\u753B\u306E\u97F3\u58F0\u3092\u6D88\u3059\u304B\u3069\u3046\u304B\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', COMMAND_Open : '\u5165\u529B\u3055\u308C\u305F\u52D5\u753B\u3092\u958B\u304D\u307E\u3059\u3002\u52D5\u753BID\u3084\u52D5\u753B\u306EURL\u3092\u5165\u529B\u3067\u304D\u307E\u3059\u3002', COMMAND_View : '\u30D7\u30EC\u30A4\u30E4\u30FC\u306E\u8868\u793A\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', COMMAND_NicoControl : '\u30CB\u30B3\u30CB\u30B3\u52D5\u753B\u30D7\u30EC\u30A4\u30E4\u30FC\u672C\u4F53\u306E\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u306E\u8868\u793A\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', COMMAND_AlwaysOnTop : '\u5E38\u306B\u5168\u753B\u9762\u8868\u793A\u3057\u307E\u3059\u3002\uFF08\u7C21\u6613\u5B9F\u88C5\u3067\u3059\uFF09', COMMAND_Shuffle : '\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u306E\u518D\u751F\u9806\u3092\u30B7\u30E3\u30C3\u30D5\u30EB\u3057\u307E\u3059\u3002', PREF_SIMPLE_PLAYLIST_VIEW : '\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u3092\u30B7\u30F3\u30D7\u30EB\u8868\u793A\u306B\u3059\u308B', DESC_SIMPLE_PLAYLIST_VIEW : '\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u3092\u30B7\u30F3\u30D7\u30EB\u8868\u793A\u306B\u3057\u307E\u3059\u3002', PREF_REMOVE_ON_FINISH : '\u518D\u751F\u304C\u7D42\u308F\u3063\u305F\u3089\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u304B\u3089\u524A\u9664\u3059\u308B', DESC_REMOVE_ON_FINISH : '\u518D\u751F\u304C\u7D42\u308F\u3063\u305F\u3089\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u304B\u3089\u524A\u9664\u3057\u307E\u3059\u3002', PREF_USE_HISTORY : '\u5C65\u6B74\u3092\u4F7F\u7528\u3059\u308B', DESC_USE_HISTORY : '\u5C65\u6B74\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002', PREF_SKIP_DELETED_VIDEO : '\u524A\u9664\u3055\u308C\u305F\u52D5\u753B\u3092\u30B9\u30AD\u30C3\u30D7\u3059\u308B', PREF_USE_OFFTIMER : '\u30AA\u30D5\u30BF\u30A4\u30DE\u30FC\u3092\u4F7F\u7528\u3059\u308B', PREF_MINUTE : '\u5206', PREF_USE_LOOP_BREAK : '\u30EB\u30FC\u30D7\u3059\u308B\u52D5\u753B\u3092\u6307\u5B9A\u56DE\u6570\u3067\u6B62\u3081\u308B', PREF_COUNT : '\u56DE', PREF_CANCEL_JUMP : '\u5225\u306E\u52D5\u753B\u306B\u79FB\u52D5\u3057\u306A\u3044\u3088\u3046\u306B\u3059\u308B', PREF_FORCE_VISIT_ON_OPERA : '\u518D\u751F\u6642\u306B\u300C\u8A2A\u554F\u6E08\u307F\u300D\u306B\u3059\u308B\u0028Opera\u306E\u307F\u0029', PREF_DEFAULT : '\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u8A2D\u5B9A\u306B\u623B\u3057\u307E\u3059\u3002', PLEASE_LOGIN : '\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044', OVER_ACCESS : '\u77ED\u6642\u9593\u3067\u306E\u9023\u7D9A\u30A2\u30AF\u30BB\u30B9', MISSING : '\u304A\u63A2\u3057\u306E\u52D5\u753B\u306F\u518D\u751F\u3067\u304D\u307E\u305B\u3093', SAVE_PLAYLIST_USAGE : '\u3053\u306E\u30EA\u30F3\u30AF\u306F\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u30EC\u30C3\u30C8\u3067\u3059\u3002\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u306B\u767B\u9332\u3059\u308B\u3053\u3068\u3067\u3053\u306E\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u3092\u5FA9\u5143\u3067\u304D\u307E\u3059\u3002\n\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u30EC\u30C3\u30C8\u306F\u30CB\u30B3\u30CB\u30B3\u52D5\u753B(http://www.nicovideo.jp/)\u306E\u30C9\u30E1\u30A4\u30F3\u4E0A\u3067\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002', PLEASE_INPUT_VIDEOID_OR_URL : '\u52D5\u753B\u306EID\u0028\u300Csm9\u300D\u306A\u3069\u0029\u3082\u3057\u304F\u306FURL\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002' }; WNP.Lang = Lang; // ==== main ==== // var fn = {}; WNP.fn = fn; BUILD_FUNC(fn); var browser = fn.browser; var ie = fn.ie; var $e = fn.$e; var isNative = fn.isNative; var toJSON = fn.toJSON; var getAbsolutePosition = fn.getAbsolutePosition; var addStyle = fn.addStyle; var getStyle = fn.getStyle; var getValidCssPropertyName = fn.getValidCssPropertyName; var $XS = fn.$XS; var findVideoTitle = fn.findVideoTitle; var getCanonicalVideoURL = fn.getCanonicalVideoURL; var createPlayInfo = fn.createPlayInfo; var postError = fn.postError; function Extension(processor) { this.processor = processor; var lines = []; this.add = function(line) { lines.push(line); }; this.process = function() { if (!this.processor) return lines.join('\n'); else { var results = []; for (var i = 0, len = lines.length; i < len; i++) { results.push(this.processor(lines[i])); } return results.join('\n'); } }; } function ExtensionPoint(name) { this.name = name; } WNP.html = { Extension: Extension, ExtensionPoint: ExtensionPoint, lines: null, browser: browser, extensions: { 'style': new Extension(function(s) { return '' }), 'playermenu.left.first': new Extension(), 'playermenu.left.last': new Extension(), 'playermenu.right.first': new Extension(), 'playermenu.right.last': new Extension(), 'controlmenu.right.first': new Extension(), 'controlmenu.right.last': new Extension(), 'panels.playlist.menu.last': new Extension(), 'panels.history.menu.last': new Extension(), 'panels.preference.normal.last': new Extension(), 'panels.preference.extend.last': new Extension(), 'panels.preference.last': new Extension(), 'panels.preference.menu.last': new Extension(), 'panels.last': new Extension(), 'script': new Extension(function(s) { return ''; }) }, build: function() { var results = []; var lines = this.lines; for (var i = 0, len = lines.length; i < len; i++) { var line = lines[i]; if (line instanceof ExtensionPoint) { if (this.extensions[line.name]) { results.push(this.extensions[line.name].process()); } else { postError("no extention. name: " + line.name); } } else { results.push(line); } } return results.join('\n'); } }; WNP.html.lines = (function() { var boxSizing = getValidCssPropertyName('box-sizing'); var backgroundSize = getValidCssPropertyName('background-size'); return [ '', '', '
', '', '', '', '', '