From e883a59f577b3281f38e1986ec496b5d441379e1 Mon Sep 17 00:00:00 2001 From: janus_wel Date: Tue, 7 Oct 2008 14:41:20 +0000 Subject: import youtubeamp.js git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@20931 d0d07461-0603-4401-acd4-de1884942a52 --- youtubeamp.js | 324 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 324 insertions(+) create mode 100644 youtubeamp.js (limited to 'youtubeamp.js') 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 + * @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