trash thread Just another WordPress weblog

293月/120

Androidでピアキャスを見る 7 VPN編

今までは3Gを利用してピアキャスをみるために不特定のグローバルIPに対してprivateを許可していましたが、このやり方では直下でリレー上限が無視されるなど予想以上に問題があることがわかってきました。安全のため、可能な方はできるだけVPNを利用した接続に切り替えてください。VPNを使うと3Gからでもローカル接続としてアクセスできるようになります。(auは2011年末からPPTPによるVPN接続が可能)

これから説明するVPN接続の前提条件として、Peercastが動作しているPCのOSがWindows7 Pro以上、ルータはPPTPに対応したものでなければなりません。 PPTP対応ルータについてはここ、XPの方はこのあたりを参考にしてください。

1.Androidの設定
2.Windowsの設定
3.Peercastの設定
4.ルータとファイアウォールの設定

Androidの設定

メニューの設定を選択

 

無線とネットワークを選択

 

VPN設定を選択

 

VPNの追加を選択

 

PPTP VPNを追加を選択

 

VPN名:この接続の名前
VPNサーバの設定:PCのグローバルIP
暗号化を有効にする:有効にしない(Android側の理由により暗号化すると接続できません)

 

作成されたVPN接続を選択する

 

ネットワークに接続を選択

 

VPN用に作成したユーザ名とパスワード(後述)を入力し接続

 

接続に成功するとVPNアイコンが表示され、ローカルIPでpeercastに接続できるようになります。(別端末からの接続なのでログイン画面が表示される)

183月/120

マルチアカウントに対応したtumblr画像reblogツール

OAuthを利用して複数アカウントにreblogできるようになったdomblrcoのテスト版です。

ブラウザアクション(アイコンをクリックしたときに出るポップアップメニュー)の「add account」でログイン中のアカウントを追加できます。2つ以上のアカウントを追加する場合はこれを繰り返してください。

Tumblr OAuth 認証画面

APIv2を利用するためprivateの投稿ができなくなりました。

※利用上の注意
テスト版です。
既にあるdomblrcoはアンインストールするか無効にしてください。

ダウンロード:domblrco_multi_account.crx

123月/122

cavetube配信アプリ テスト版2

Androidから配信したい旨を説明したところサイト側で対応してくれました!感謝!
ということで、テスト配信もできるようになったCaveCastです。

cavecast 配信開始画面

cavecast 配信設定画面

cavetube 配信画面の解説

03/18
配信設定で画質「きれい」または「なめらか」を設定できるようになりました。
03/19
コメントの投稿と取得ができなくなっていたのを修正しました。
05/04
カメラが複数ある端末に対応(未チェック)
設定画面がメニューキーから呼び出し可能になりました。
仕様変更によりコメントが投稿できなくなっていたのを修正しました。

ダウンロード:CaveCast.apk

Filed under: 未分類 2 Comments
23月/120

cavetube配信アプリ テスト版

cavetube向けAndroid配信アプリCavaCastを実験中。

 

1.CavaCastのダウンロード

下記リンクからCavaCastをダウンロードしてインストールします
CavaCast.apk

 

2.配信用FMSアドレスの取得

Androidの標準ブラウザを起動してPCのときと同じように配信を開始し
外部エンコーダを使った配信という項目からFMSのURLをクリップボードにコピーします。
(画面はPCのものです)

cavetube 配信開始画面

 

3.配信開始

CaveCastを起動してbroadcastアイコンをタップし
FMSのURLを入力する項目に先ほどコピーしたアドレスを貼り付けて配信を開始します。
(クリップボードにコピーしてあれば自動的に入力されます)

cavecast 配信開始画面

 

4.コメントの取得

CaveCastはコメントを取得できますが、配信IDを自動的に取得する方法がないので一覧から選択する方式になっています。つまりテスト配信のコメントは取得できません。配信一覧に載るまでに配信開始から最大で1分ほどかかる場合があります)

cavecast コメント取得画面

 

5.コメントの投稿

tweetアイコンからコメントを書き込めます。ツイッターには投稿しません。

Filed under: 未分類 No Comments
13月/120

tumblrのarchiveページでスクロールとともに上から自動消去

tumblrのarchiveページは画像が大量に表示されると重くなってくるので増えてきたら自動で削除したい。昔autopagerizeで同じことを試みたが表示上の問題で失敗に終わった。しかしこちらは表示位置が絶対座標なので問題なし!

以下ソースコード

(function() {

	setInterval(function(){
		var elms = document.getElementById("content").getElementsByTagName("a");
		for(var i=0;i<elms.length-500;i++){
			elms[i].parentElement.removeChild(elms[i]);
		}
	},20000);

})();

Tumblr Archive Auto Remover

ダウンロード:tumblr_archive_autoremove.user.js

UserScriptなのでchromeなどではリンクをクリックするかダウンロードしたファイルをブラウザにドラッグドロップするとインストールできます。

292月/120

ピアキャスで受信が終了したチャンネルの一括削除

ピアキャストで配信を見ているといつのまにかチャンネルが大量に増え、peercast.exeを終了しても一覧に残っていることがあります。そこでテンプレートを改造し、受信していないチャンネルを全て停止するリンクを作成しました。

ピアキャストの不思議な仕様対策メモ

  • ピアキャストのhtmlテンプレートにjavascriptを記述するには、特殊文字{を{{としなければならない
  • 外部jsを呼び出す際に拡張子がjsだと開けない
  • chromeを使用してXMLHttpRequestでxmlにアクセスするとresponseXMLがエラーになる

このあたりに注意して作成したのがこちら

relays.html

<html>
<head>
...略...
<script src="stopall.js.html"></script>
</head>
<body>
...略...
<a href="javascript:void(0);" onClick="stopAllChannel()">全て停止</a>
...略...
</body>
</html>

stopall.js.html

function stopAllChannel(){{
  var xhr = new XMLHttpRequest();
  xhr.open("GET", "http://127.0.0.1:7144/admin?cmd=viewxml", true);
  xhr.onreadystatechange = function() {{
    if(window.DOMParser){{
      if(xhr.responseText.indexOf("</peercast>")>0){{
          var domParser = new DOMParser();
          var dom = domParser.parseFromString(xhr.responseText, "application/xml");
          onDocument(dom);
          xhr.abort();
      }
    }else{{
      if (xhr.readyState == 4 && xhr.status == 200){{
        onDocument(xhr.responseXML);
      }
    }
  }
  xhr.send();
}

function onDocument(dom){{
  var channels_relayed = dom.getElementsByTagName("channels_relayed")[0];
  var channels = channels_relayed.getElementsByTagName("channel");
  for(var i=0;i<channels.length;i++){{
    var relay = channels[i].getElementsByTagName("relay")[0];
    var status = relay.getAttribute("status");
    if(status!="RECEIVE" && status!="BROADCAST"){{
      var id = channels[i].getAttribute("id");
      stopChannel(id);
    }
  }
  alert("受信していないチャンネルを全て終了しました");
}

function stopChannel(id){{
  var xhr = new XMLHttpRequest();
  xhr.open("GET", "http://127.0.0.1:7144/admin?cmd=stop&id="+id, true);
  xhr.send();
}

2012/03/03 追記
停止が完了する前にリロードしてしまっていたのでリロードしないように修正しました。

ダウンロード:IM0043_html.zip

Filed under: 未分類 No Comments
72月/120

野良アプリに自動更新のような機能を実装する

アプリ起動中に更新チェックとapkファイルのダウンロードを行い、インストール画面を表示する方法。
公式マーケットのようにユーザーの操作を一切必要とせずアプリを更新するものではありません。
動作としてはAdobe AIRの自動更新に近いものです。

 

まずはバージョンチェック用のxml
バージョン情報と最新版apkファイルのurlを記載します 。

<?xml version="1.0" encoding="utf-8"?>
<update>
  <versionCode>4</versionCode>
  <versionName>1.2</versionName>
  <url>http://myserver.net/update.apk</url>
  <description><![CDATA[
    test
  ]]></description>
</update>

 

自動更新したいアプリ本体のソースはだいたい以下のようになります。最新版apkと上記xmlをサーバにアップロードしてupdateXmlUrlに指定。

public class AutoUpdateTestActivity extends Activity implements AutoUpdateEventListener {

	private final String updateXmlUrl = "http://myserver.net/update.xml";

	private Handler handler;
	private Updater updater;

	public void onCreate(Bundle savedInstanceState) {

		handler = new Handler();
//1.更新チェック
		updater = new Updater(this, updateXmlUrl);
		updater.updateCheck();
	}

	@Override
	public void onUpdateAvailable() {
//2.アップデートダイアログの表示
		handler.post(new Runnable() {
			@Override
			public void run() {
				showUpdateDialog();
			}
		});
	}

	private void showUpdateDialog(){
		new AlertDialog.Builder(this)
			.setTitle("Update")
			.setIcon(R.drawable.ic_launcher)
			.setMessage("Update available")
			.setPositiveButton("Update",
				new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
//3.ダウンロード開始
						updater.downloadApk();
					}
				})
			.setNegativeButton("Cancel", null)
			.show();
	}

	@Override
	public void onUpdateApkDownloadComplete() {
//4.インストール
		handler.post(new Runnable() {
			@Override
			public void run() {
				updater.installApk();
			}
		});
	}

	public void onDestroy() {
//5.テンポラリファイルの削除
		updater.deleteTempApkFile();
	}
}

 

Updaterは長いので一部抜粋。
アプリのversionCodeとversionNameを取得

PackageManager pm = activity.getPackageManager();
String packageName = activity.getPackageName();
PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_META_DATA);

int versionCode = packageInfo.versionCode;
String versionName = packageInfo.versionName;

 

更新用xmlからversionCodeとversionName、apkファイルのurlを取得

HashMap<String, String> map = new HashMap<String, String>();

InputStream is = new URL(updateXmlUrl).openConnection().getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);

DocumentBuilderFactory document_builder_factory = DocumentBuilderFactory.newInstance();
DocumentBuilder document_builder = document_builder_factory.newDocumentBuilder();
Document document = document_builder.parse(bis);
Element root = document.getDocumentElement();

if(root.getTagName().equals("update")){
  NodeList nodelist = root.getChildNodes();
  for (int j=0;j<nodelist.getLength();j++){
    Node node = nodelist.item(j);
    if(node.getNodeType()==Node.ELEMENT_NODE){
      Element element = (Element) node;
      String name = element.getTagName();
      String value = element.getTextContent().trim();
      map.put(name, value);
    }
  }

  int versionCode = Integer.parseInt(map.get("versionCode"));
  String versionName = map.get("versionName");
  String updateApkUrl = map.get("url");
}

 

apkファイルのダウンロード

URL url = new URL(updateApkUrl);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
urlConnection.connect();
InputStream is = urlConnection.getInputStream();

File cacheDir = getExternalCacheDir();
File tempApkFile = File.createTempFile("apk", ".apk", cacheDir);
FileOutputStream os = new FileOutputStream(tempApkFile);

byte[] buffer = new byte[1024];
int bufferLength = 0;

while ( (bufferLength = is.read(buffer)) > 0 ) {
	os.write(buffer, 0, bufferLength);
}
os.close();
is.close();

 

インストール画面の表示

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri dataUri = Uri.fromFile(tempApkFile);
intent.setDataAndType(dataUri, "application/vnd.android.package-archive");
startActivity(intent);

 

AutoUpdateEventListenerやその他細かい部分はソースをダウンロードしてください。エラー処理などはかなり適当です。それとインストール用のapkファイルを本体側に保存するとなぜかインストールできませんでした。AndroidManifest.xmlが読み込めないとか何とか・・・。

ソースダウンロード: AutoUpdateTest_src.zip

Filed under: Android No Comments
311月/1223

Androidでピアキャスを見る 6

この度Android Peca Testはバージョン2.0になりました。

主な変更点

  • お気に入りなどチャンネル一覧をタブ形式に
  • メニューの追加(更新とローカル/グローバルの変更)

Android Peca Test チャンネル一覧画面

Android Peca Test  2.0 β のダウンロード

 

02/12 追記

バージョン2.1で次の機能が追加されました。

  • 自動更新機能
  • フィルタのインポート機能

ファイル入出力のため今回のアップデートでSDカード権限が追加されています。
こちらのインポートデモからPecaRecorderやpcypListのフィルタ(お気に入り)をインポートできます。

Android Peca Test 自動更新画面

Android Peca Test 2.1 β のダウンロード

 

04/25 追記

バージョン2.2でYPを追加できるようになりました。これに伴いキャッシュサーバを利用する機能は削除されています※。3G回線で視聴する場合はVPN接続に切り替えてください。VPN接続中は自宅PC経由のアクセスになるためYP取得時ポートが開放された状態になります。(VPNの接続方法はこちら

※2.1以前のバージョンの方はまだ少しの間利用できますが、そのうち利用できなくなります

Android Peca Test 2.2 のダウンロード

Filed under: Android, peercast 23 Comments
241月/121

Androidでピアキャスを見る 5 現状まとめ

androidでpeercastを視聴する人が増えてきたので表にまとめました

Peercast IM版 ─いいえ─ Android PecaまたはpecaIndex+Android Peca(※)

はい
YPを追加したい ─いいえ─ Android Peca

はい
vMPlayerを使う ─いいえ─ pecaIndex+Android Peca(※)

はい
pecaIndex

※PecaIndexの視聴アプリ設定でAndroidPecaを選択

 

PeercastIM+vMPlayerの場合はPecaIndexのみで視聴できます。
PeercastVPやVPlayerを使う場合はAndroidPecaが必要。(VPlayerやその他大抵のプレイヤーはmms://でなければ再生できずリレーを開始することができないため)

 

peercast本体の設定

03/27 追記
localhost以外からリレーを開始するにはPrivateを許可する必要がありますが、配信したり直下になったりするとリレー上限が無視されるようです。3Gのために全IP(255.255.255.255)を許可するのは危険なので、ローカルのみの利用が無難。どうしても外で見たい場合はVPNなどを利用してください。

Filed under: Android, peercast 1 Comment
2212月/110

windows用のtumblr画像バックアップアプリ 2

tumblr画像バックアップアプリにpost情報を表示するビュワーを追加しました。
バックアップされた画像ファイルをビュワーにドラッグ&ドロップすると説明文(キャプション)が表示されます。画像ラベルやキャプションのリンクから記事を開くことができます。

tumblr画像バックアップアプリのビュワー画面1

tumblr画像バックアップアプリのビュワー画面1

tumblr画像バックアップアプリのビュワー画面2

※実行にはjavaランタイムが必要です。
すでに利用されている方はzipを展開してできたファイルをすべて既存のフォルダへ上書きコピーしてください。

12/23 一部画像がエラーで表示できない問題を修正しました
ダウンロード:tumblr_photo_backup.zip

Filed under: 未分類 No Comments