ラベル google drive の投稿を表示しています。 すべての投稿を表示
ラベル google drive の投稿を表示しています。 すべての投稿を表示

2016/04/14

VLCプレイリスト出来なかったのでHLSメニューをクラウドファイルで

タイトルが何言ってるかよく分からないですね。

我が家で地デジ録画システムが安定稼働しているが、録画していない時は recfsusb2nでリアルタイムHLS (HTTP Live Streaming) をしている。それを時々、VLCからURL直接叩いて視聴するということをやっているのだけど、URLだとどの放送局なのかが良くわからない。
そうだ!プレイリスト形式でチャンネルリスト作ってやればいいじゃないか!

今更ながらに閃いたわけですが、簡単だろと色々トライしてみたけど出来なかった・・・
だから別の方法で解決した。というお話です。

1stトライ
録画サーバーにM3U形式のチャンネルURLリストを出力させるようにして、VLC media player使って「ネットワークストリームを開く」にからアクセスするとM3Uリストと認識して読んでくれる。
中身はこんな感じです。アドレス:ポートは本物じゃありません。
#EXTM3U
#EXTINF:0,NHK総合
http://111.222.333.444:8888/27
#EXTINF:0,NHKEテレビ
http://111.222.333.444:8888/26
#EXTINF:0,日本テレビ
http://111.222.333.444:8888/25
#EXTINF:0,テレビ朝日
http://111.222.333.444:8888/24
#EXTINF:0,テレビ東京
http://111.222.333.444:8888/23
#EXTINF:0,TBS
http://111.222.333.444:8888/22
#EXTINF:0,フジテレビ
http://111.222.333.444:8888/21
#EXTINF:0,TOKYO MX
http://111.222.333.444:8888/20
VLCデスクトップ版は大丈夫なのです。いや違うか。プレイリストを外部から読み込む機能はないので、「ネットワークストリームを開く」でリストを開くと最初に書いてあるURLから再生が始まってしまう。それを停止するとやっとプレイリストが現れる。でも何とかOK。

VLC for iOS、VLC for Android/Fire だと、同じように最初のURLが再生されるが、プレイリストとして一覧表示してくれない。プレイリストとして読んだのではなく 'mpegurl' ファイルだとしか認識していないようだ。全然ダメだ。

よって、簡単だと思っていたことは脆くも断念することとなった。

もう一つの条件は、外からもアクセスできるようにしたかったので、HLSのURLはWANアドレスにしなければならない。WANアドレスは時々変わってしまうのでファイルをローカルに持つことが出来ないのだ。

VLC for iOSはクラウド対応になっている。これを利用しよう。
HLSサーバーの方からクラウドへHLSファイルとしてアップロードしておけばいい。
チャンネルごとのmpegurlファイルのリスト表示で良しとしよう。

VLC for Android/Fireはクラウド非対応。こっちは「ES File Explorer」を使う。
そっちからクラウドへアクセスする。で、ファイルをタップすると”どのアプリ使って再生する?”って聞いてくるので”VLC”をデフォルトアプリに設定すれば、ほぼ同じような使い心地となる。
他のファイルマネージャアプリでもいいと思う。

Google Drive使う
これは自分がよく使うところだからという理由。適当な場所に下のようなファイルを作ってあげます。
チャンネル名.ts ファイル の中身
#EXTINF:0,チャンネル名
http://111.222.333.444:8888/27
VLC for iOSからGoogle Drive上の チャンネル名.tsファイル をタップするとEXTINFOに書いてあるチャンネル名が表示されて、その下のURLからHLS再生してくれます。

拡張子の".ts"はVLCが認識する拡張子ならなんでもいいだろうけどナマのmpegtsなので".ts"が適当かなと思ってそうしました。

WANアドレス変わったらどうする?
はい。いつものようにスクリプトを書きましたとも。
Google Cloud Platformコンソールの「API Manager」から
Drive APIを有効にして、OAuth認証情報を作成して、gimite/google-drive-ruby 入れて、
以下の様なRubyスクリプトを書いて、
# coding: utf-8
#require "google/api_client" ←はずさないとgemがコンフリクトする
require "google_drive"
require 'net/http' ↓ここで自分のWANアドレス取得
result = Net::HTTP.get(URI.parse('http://自分のWANアドレス取得.appspot.com'))

URL = "http://#{result}:8888"
DIR = "MyTV"←GoogleDrive上のフォルダ
Channels = {
  "NHK総合.ts" => "#EXTINF:0,NHK総合\n#{URL}/27",
  "NHKEテレビ.ts" => "#EXTINF:0,NHKEテレビ\n#{URL}/26",
  "日本テレビ.ts" =>"#EXTINF:0,日本テレビ\n#{URL}/25",
  "テレビ朝日.ts" => "#EXTINF:0,テレビ朝日\n#{URL}/24",
  "テレビ東京.ts" => "#EXTINF:0,テレビ東京\n#{URL}/23",
  "TBS.ts" => "#EXTINF:0,TBS\n#{URL}/22",
  "フジテレビ.ts" => "#EXTINF:0,フジテレビ\n#{URL}/21",
  "TOKYO MX.ts" => "#EXTINF:0,TOKYO MX\n#{URL}/20"
}
session = GoogleDrive.saved_session("./google_drive_config.json")
dir = session.collection_by_title(DIR)
Channels.each do |key,c|
  file = dir.file_by_title(key)
  if file
    file.update_from_string(c)
  else
    file = session.upload_from_string( c, key, content_type: 'application/x-mpegurl')
    dir.add(file)
  end
end
実行する。一発目はDriveAPIの承認処理とかでゴニョゴニョあるけど。
content_type : 'application/x-mpegurl'としているけれど、mpegurlならなんでも大丈夫かも。
    # M3U8 media types
    # application/mpegurl
    # application/x-mpegurl
    # audio/mpegurl
    # audio/x-mpegurl
'text/plain'じゃだめだった。指定しないとGoogleドキュメントタイプになるようだ。
'audio/x-mpegurl'にするとGoogleDriveアイコンが変なのになる。これはこれでいいかも。

1つ難点が
綺麗に出来上がった風だが、"MyTV"フォルダ(API的にはCollect)に直接ファイルを作成したいのだが、それが出来ない。ファイルはルートに作成されてしまう。
dir.add(file)でMyTVフォルダにtsファイルを配置することはできるが、ルートから移動するのではなくルートにあるファイルオブジェクトの虚像が置かれるだけ。そのためルート上のtsファイルを削除すると一緒に消えてしまう。
最初ファイル作成した後はカッコ悪いが手動でMyTVへ移動させる必要がある。
その後はアップデート処理になるのでMyTVフォルダ内で更新される。

これを時々クーロンとかで実行するとか、WANアドレス監視をして変更された時だけ実行するとか。
簡単なことだと思って始めたら、結果こんなんなってしまった。

2012/07/03

Google Driveとgriveとgitリポジトリ

突然「Google-Drive」の話です

サーバーアプリ開発は何処でも出来る。Linux(Ubuntu)、Mac、Windowsどれも使ってるんでクラウドで環境を共有化したくなるのが自然かなと。ということで実際やってみたものの・・・というお話。

Google Drive
DropBoxでも良かったんですが、こちらは妻と別用途で利用中なので怪しいものは入れられないのです。それで、このためにGoogleDriveを利用することにしたわけです。
(GoogleDriveについては、色々親切ページがあるので、そちらを参照してくださいな)

grive
MacとWindowsのクライアントソフトは本家からダウンロードすれば済みましたが、Linux環境がね・・・
で見つけたのが、「grive」です。griveについては、google-drive CLI 'grive'を参考にされるとよいでしょう。自分と同じUbuntu12.04LTSへインストールしておられます。

だけどね・・・
Windows/Macクライアントは今同期して!っていうのが出来ない。行ったり来たりがスピーディに出来ない。まあそういう用途向きじゃないのはわかるけど。逆にgriveは「今!」しかないんで、ついその感覚になってしまう。

バックアップファイル問題
どこでもだいたいEmacsで編集してるんだけれど、Emacsで変更するとバックアップファイルが作られる。というか、今までのものが'~'付きにリネームされるといったほうが正しいか。これのためか、'~'付きのファイルが同期対象になってしまって、最新ファイルが更新されないとか紛失したりとか。ついにはUbuntuからのgriveがパニック起こしたりとか。そうなったら諦めて新しいフォルダで再構築。orz.

Linuxファイルパーミッション問題
Ubuntuでパーミッション設定していても、Windowsで編集して更新してしまうとパーミションが普通のファイルになってしまう。パーミッション情報は保存されないってことなのでしょうね。そういうものなのかな。別のツール使えば大丈夫?

とにかくこのために、#!/usr/bin/pythonって書いてもパーミション設定が保証されないので、スクリプトコマンドではなく、ただのスクリプトファイルとして扱うことにしたわけです。
(最初にこの記事を読まれると、さっぱり意味不明だと思うので、前記事を参照されたし)

griveの操作感覚は自分好みだけど、その他のクライアント環境がイージー過ぎて、思い通りじゃないっす。自分とそういう環境の相性が悪いだけかもしれないけどね。

GoogleDriveはSDKもあるらしいから、不満だったら自分でクライアント作ればいいんだよ。と遠くの方から聞こえてきそうだけど、それはそれ。きっと賢い方が作ってくれているはずさ。自分は世界中の「それ」を探して活用するスキルを高めるのさ。

探してみたところ
Linuxのfuseラッパーとして使えるfuse-google-driveがありました。
https://github.com/jcline/fuse-google-drive

rubyでアクセスするgemパッケージもありますね。
https://github.com/gimite/google-drive-ruby

うーん。どっちも便利だけど開発ソース共有には向かないなぁ。

やっぱりバージョン管理リポジトリでやるか
今回のような目的には、svnやgitでバージョン管理の方が適してる。仕事でなら日頃使っているけど、プライベートだとリポジトリの置き場に困る。
https://sites.google.com/site/repositorylist/ こちらよると、無料で使えるサイトが幾つかあるらしい。
また共有フォルダでイラっときたら、考えようかなと思ったけど、まてよ?
せっかくGoogleDrive使ってるんだったら、そこにリポジトリ構成できないのかな?

「google drive git」で調べてみると、おやおや、できそうじゃないですか。
参照サイトページ
using-google-drive-with-git
how-use-google-drive-or-dropbox-host-your-private-git-repositories
こういう情報が豊富なのが(多少不満があれど)メジャー環境を使うメリット。

手順はだいたいこんな感じ
  • ローカルリポジトリを適当に構築
  • GoogleDriveフォルダ上で共有マスターリポジトリ作成
    • $ git init [repos.dir] --bare
  • ローカルリポジトリへ戻ってリモート設定
    • $ git remote add origin file:///[repos.fullpath]
  • ローカル編集したらコミット ・・・◎
  • 共有リポジトリへプッシュ
  • (Linuxのgriveを実行してサーバー同期)
  • 別環境からのクローン
    • git clone file:///[GoogleDrive.repos.fullpath]
    • git pull
  • 後は◎からと同じ
要はgithubに公開リポジトリ作成するのと大体同じで分散リポジトリでやればいいってことかな。だけどね。grive同期なら即時反映でいけるんだけど、Mac/WindowsのGoogleDriveからだと、マスターリポジトリへプッシュした変更がちゃんとサーバーへ伝わらないっす。

結局
手順が増えた分確実性が増すならいいんだけれど、不確実なところは変わらなかったので、今のところ普通にGoogleDriveのファイル管理のまま使用しております。
もっと、確実性のある即時同期型のシェアフォルダないっすかね。

grive の mac/windows版があれば一番いいんだけれど。