2012年03月18日

やたー。emacs-w3mでリンク先のyoutubeの動画をmplayerを使ってストリーミング再生できたよー

前回の記事 で生のmpg,wmv,avi,flv程度は emacs-w3mからmplayerを叩いてストリーミング再生できるようにしたんだけども やっぱりここは動画サイトで最も有名なyoutubeぐらいは 同じようにストリーミング再生したいよねってことで 一応できるようにしてみました。 若干手抜きというかアレですが。

まず、youtubeのURLから動画ファイルそのもののURLを引き出すために youtube-dlというPythonスクリプトを導入します。

homebrew使いなら

$ brew install youtube-dl

で入れられるし、 MacPorts使いでも

$ sudo port install youtube-dl

で入れられるはずです。

Ubuntu Linuxでも

$ sudo aptitude install youtube-dl

とか、他は apt-get なり Synaptic なりなんなりで入れられるみたいなので 適当に放り込んでください。

んで、こいつを入れると名前の通りyoutubeの動画を保存できるはずですけども 今回は動画ファイルの場所を拾えるという機能が大事。

$ youtube-dl -g http://www.youtube.com/embed/6vHlmdrvrYo

とかすると、 以前書いた記事の、ルパン風タイトルが云々 の動画のURLが取得できる感じ。

この情報を元にストリーミング再生をしたければ 14.2. YouTubeの動画をMPlayerでストリーミング再生する というページに書かれているように

$ mplayer $(youtube-dl -g http://www.youtube.com/embed/6vHlmdrvrYo)

とでもやればmplayerでYoutubeの動画をストリーミング再生ができる。 でもこの"$()"ってのがクセモノ。 コマンド置換っていうものらしいんだけど、こいつ、Emacs Lispでどうしたらいいの?

と思ったのでズルして ~/bin/play-youtube に適当なシェルスクリプトを用意。

#!/bin/bash
mplayer -fs $(youtube-dl -g $1)

~/bin にPATHを通しておいてこれを置くと

$ play-youtube http://www.youtube.com/embed/6vHlmdrvrYo

でmplayerでフルスクリーンの動画を開ける感じ。 フルスクリーンなのは僕の趣味。

あとは前回の記事の関数を少し書き直せばOK

(defun w3m-play-movie ()
  (interactive)
  (let ((url (w3m-anchor)))
    (cond ((string-match "^http:\\/\\/www\\.youtube\\.com" url)
           (message (concat "loading from youtube... " url))
           (call-process "play-youtube" nil nil nil url))
          ((string-match (concat "^http.*" (regexp-opt '(".mpg" ".wmv" ".avi" ".flv")) "$") url)
           (call-process "mplayer" nil nil nil "-fs" url))
          (t
           (message "not movie.")))))

リンク先のドメインがyoutubeっぽかったらplay-youtubeを叩くようにしている感じ。

地味にifじゃなくなったり 前回の正規表現部分がregexp-optに変わってたりするのはおまけ。 regexp-opt便利ですね。 教えてくださりありがとうございます、cvmatさん!

ってのを作ったけど、俺ほとんどyoutube見ないんだよね。 ついでにやりたかっただけ感がすごい。

posted by 麦汁 at 12:16 | Comment(0) | TrackBack(0) | emacs | このブログの読者になる | 更新情報をチェックする

2012年03月17日

emacs-w3mからリンク先の動画をストリーミング再生する、みたいな

emacs-w3mでWebブラウジングしてて 「あー、リンク先の動画を、せめて生ファイルぐらいはそのままストリーミングで再生したいなー」 とか思っちゃったのでとりあえず以下のようなコマンド用意した。

(defun w3m-play-movie ()
  (interactive)
  (let ((url (w3m-anchor)))
    (if (string-match "^http.*\\.\\(mpg\\|wmv\\|avi\\|flv\\)$" url)
        (call-process "mplayer" nil nil nil "-fs" url)
      (message "not movie."))))
(define-key w3m-mode-map "m" 'w3m-play-movie)

非常に単純なので読めばわかると思うけど、 m を叩いた時にカーソルがある位置のリンクのアドレスを見て もしmpg,wmv,avi,flvだったらmplayerにそれを渡すってだけの代物。 一応、リンク先が上記の拡張子にマッチしなかったら「not movie.」とか適当なメッセージ出している。

ちなみにmplayerの呼出は同期プロセスとして呼んでます。 非同期である必要性を感じなかったので。

もしblogにUPされてるこの記事を見た時に 正規表現中のバックスラッシュが連続二つになってなかったら 全て、連続二つにしておいてください。 「バックスラバックスラ.バックスラバックスラ(mpgバックスラバックスラ|wmv…」 みたいな感じで。

結構、emacs lispの正規表現をblogに上げているやつは、ここの記事に限らず、 UPしたタイミングぐらいで連続したバックスラッシュが1つに削られて そのまま実行しようとしても怒られることが多いので覚えておくといいです。

そもそもemacs lispの正規表現があれ……

posted by 麦汁 at 22:52 | Comment(0) | TrackBack(0) | emacs | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。