diff options
author | janus_wel | 2008-10-07 14:41:20 +0000 |
---|---|---|
committer | janus_wel | 2008-10-07 14:41:20 +0000 |
commit | e883a59f577b3281f38e1986ec496b5d441379e1 (patch) | |
tree | a51f27575e41964d288ed02a6f0c786205e33579 /youtubeamp.js | |
parent | b91995af595b8ffe1b87964dc6080efb761671e6 (diff) | |
download | vimperator-plugins-e883a59f577b3281f38e1986ec496b5d441379e1.tar.bz2 |
import youtubeamp.js
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@20931 d0d07461-0603-4401-acd4-de1884942a52
Diffstat (limited to 'youtubeamp.js')
-rw-r--r-- | youtubeamp.js | 324 |
1 files changed, 324 insertions, 0 deletions
diff --git a/youtubeamp.js b/youtubeamp.js new file mode 100644 index 0000000..df38ca8 --- /dev/null +++ b/youtubeamp.js @@ -0,0 +1,324 @@ +/* + * ==VimperatorPlugin== + * @name youtubeamp.js + * @description this script give you keyboard opration for youtube.com. + * @description-ja YouTube のプレーヤーをキーボードで操作できるようにする。 + * @author janus_wel <janus_wel@fb3.so-net.ne.jp> + * @version 0.10 + * @minversion 1.2 + * ==VimperatorPlugin== + * + * LICENSE + * New BSD License + * + * USAGE + * :ytinfo + * プレーヤーに関しての情報を表示する。今のところバージョンだけ。 + * :ytpause + * 再生 / 一時停止を切り替える。 + * :ytmute + * 音声あり / なしを切り替える。 + * :ytsize + * 最大化 / ノーマルを切り替える。動いてない。 + * :ytseek [position] + * 指定した場所にシークする。秒数で指定が可能。 + * 指定なしの場合一番最初にシークする。 + * :ytseek! delta + * 現在の位置から delta 分離れた所にシークする。秒数で指定が可能。 + * マイナスを指定すると戻る。指定なしの場合変化しない。 + * :ytvolume [volume] + * ボリュームを設定する。 0 ~ 100 が指定できる。 + * 指定なしの場合 100 にセットする。 + * :ytvolume! delta + * ボリュームを現在の値から変更する。 -100 ~ +100 を指定可能。 + * 指定なしの場合変化しない。 + * + * SEE ALSO + * http://code.google.com/apis/youtube/js_api_reference.html + * + * HISTORY + * 2008/10/07 ver. 0.10 - initial written. + * */ + +(function(){ + +Function.prototype.bind = function(object) { + var __method = this; + return function() { + return __method.apply(object, arguments); + } +}; + +// class definition +// YouTubePlayerController Class +function YouTubePlayerController() { + this.initialize.apply(this, arguments); +} +YouTubePlayerController.prototype = { + initialize: function () { + this.fuller = this._changeToFull.bind(this); + }, + + constants: { + VERSION: '0.10', + + CARDINAL_NUMBER: 10, + + YOUTUBE_DOMAIN: '.youtube.jp', + YOUTUBE_URL: '^http://[^.]+\\.youtube\\.com/', + WATCH_URL: 'http://[^.]+\\.youtube\\.com/watch', + WATCH_PAGE: 1, + + PLAYER_NODE_ID: 'movie_player', + + STATE_PLAYING: 1, + + SIZE_WIDTH_DEFAULT: 480, + SIZE_HEIGHT_DEFAULT: 385, + + NAME_PLAYER_VERSION: 'PLAYER_VERSION', + + SEEKTO_DEFAULT: 0, + SEEKBY_DEFAULT: 0, + VOLUMETO_DEFAULT: 100, + VOLUMEBY_DEFAULT: 0, + + HIDE_NODES: [ + 'old-masthead', + 'watch-vid-title', + 'watch-other-vids', + 'old-footer', + 'copyright', + 'watch-main-area', + 'watch-comments-stats', + 'watch-video-response', + ], + }, + + getControllerVersion: function () { return this.constants.VERSION; }, + + pagecheck: function() { + if(this.getURL().match(this.constants.WATCH_URL)) return this.constants.WATCH_PAGE; + throw new Error('current tab is not watch page on youtube.com'); + }, + + getURL: function() { return liberator.buffer.URL; }, + + _player: function() { + if(this.pagecheck() === this.constants.WATCH_PAGE) { + var player = this._getElementById(this.constants.PLAYER_NODE_ID); + if(! player) throw new Error('player is not found'); + + return player; + } + return null; + }, + + togglePlay: function() { + var p = this._player(); + (p.getPlayerState() !== this.constants.STATE_PLAYING) + ? p.playVideo() + : p.pauseVideo(); + }, + + toggleMute: function() { + var p = this._player(); + p.isMuted() ? p.unMute() : p.mute(); + }, + + toggleSize: function() { + var p = this._player(); + (p.width == this.constants.SIZE_WIDTH_DEFAULT && p.height == this.constants.SIZE_HEIGHT_DEFAULT) + ? this._fullSize() + : this._normalSize(); + }, + + _changeToFull: function () { + var p = this._player(); + setTimeout(function () { + p.width = window.innerWidth; + p.height = liberator.buffer.pageHeight; + }, 0); + }, + + _getElementById: function (id) { + var e = window.content.document.getElementById(id); + if (!e) return null; + + return e.wrappedJSObject + ? e.wrappedJSObject + : e; + }, + + _fullSize: function () { + var b = this._getElementById('baseDiv'); + this.defMargin = b.style.margin; + this.defPadding = b.style.padding; + this.defWidth = b.style.width; + b.style.margin = 0; + b.style.padding = 0; + b.style.width = '100%'; + + for (var i=0, max=this.constants.HIDE_NODES.length ; i<max ; ++i) { + var h = this._getElementById(this.constants.HIDE_NODES[i]); + if (h) { h.style.display = 'none'; } + } + + this._changeToFull(); + + window.addEventListener( + 'resize', + this.fuller, + false + ); + }, + + _normalSize: function () { + var b = this._getElementById('baseDiv'); + b.style.margin = this.defMargin; + b.style.padding = this.defPadding; + b.style.width = this.defWidth; + + for (var i=0, max=this.constants.HIDE_NODES.length ; i<max ; ++i) { + var h = this._getElementById(this.constants.HIDE_NODES[i]); + if (h) { h.style.display = 'block'; } + } + + var p = this._player(); + p.width = this.constants.SIZE_WIDTH_DEFAULT; + p.height = this.constants.SIZE_HEIGHT_DEFAULT; + + window.removeEventListener( + 'resize', + this.fuller, + false + ); + }, + + seekTo: function(position) { + if(position) { + if(position.match(/^(\d+):(\d+)$/)) { + position = parseInt(RegExp.$1, this.constants.CARDINAL_NUMBER) * 60 + + parseInt(RegExp.$2, this.constants.CARDINAL_NUMBER); + } + if(isNaN(position)) throw new Error('assign unsigned number : seekTo()'); + } + else position = this.constants.SEEKTO_DEFAULT; + + var p = this._player(); + p.seekTo(position); + }, + + seekBy: function(delta) { + if(delta) { + if(isNaN(delta)) throw new Error('assign signed number : seekBy()'); + } + else delta = this.constants.SEEKBY_DEFAULT; + + var p = this._player(); + var position = p.getCurrentTime(); + position += parseInt(delta, this.constants.CARDINAL_NUMBER); + + p.seekTo(position); + }, + + volumeTo: function(volume) { + if(volume) { + if(isNaN(volume)) throw new Error('assign unsigned number : volumeTo()'); + } + else volume = this.constants.VOLUMETO_DEFAULT; + + var p = this._player(); + p.setVolume(volume); + }, + + volumeBy: function(delta) { + if(delta) { + if(isNaN(delta)) throw new Error('assign signed number : volumeBy()'); + } + else delta = this.constants.VOLUMEBY_DEFAULT; + + var p = this._player(); + var volume = p.getVolume(); + volume += parseInt(delta, this.constants.CARDINAL_NUMBER); + + p.setVolume(volume); + }, +}; + +// global object +var controller = new YouTubePlayerController(); + +// command register +liberator.commands.addUserCommand( + ['ytinfo'], + 'display player information', + function() { + try { + var info = [ + 'controller version : ' + controller.getControllerVersion(), + ].join("\n"); + liberator.echo(info, liberator.commandline.FORCE_MULTILINE); + } + catch(e) { liberator.echoerr(e); } + }, + {} +); + +liberator.commands.addUserCommand( + ['ytpause'], + 'toggle play / pause', + function() { + try { controller.togglePlay(); } + catch(e) { liberator.echoerr(e); } + }, + {} +); + +liberator.commands.addUserCommand( + ['ytmute'], + 'toggle mute', + function() { + try { controller.toggleMute(); } + catch(e) { liberator.echoerr(e); } + }, + {} +); + +liberator.commands.addUserCommand( + ['ytseek'], + 'controll seek bar', + function(arg, special) { + try { special ? controller.seekBy(arg) : controller.seekTo(arg); } + catch(e) { liberator.echoerr(e); } + }, + { + bang: true, + } +); + +liberator.commands.addUserCommand( + ['ytvolume'], + 'controll volume', + function(arg, special) { + try { special ? controller.volumeBy(arg) : controller.volumeTo(arg); } + catch(e) { liberator.echoerr(e); } + }, + { + bang: true, + } +); + +liberator.commands.addUserCommand( + ['ytsize'], + 'toggle video size', + function() { + try { controller.toggleSize(); } + catch(e) { liberator.echoerr(e); } + }, + {} +); + +})() + +// vim: set sw=4 ts=4 et; |