ニコニコ動画はxml形式で動画の情報を取得する事が出来る。この情報を利用して、Youtubeの動画URLからタイトル、再生時間、サムネイルのBitmapを取得するサンプルコードを紹介する。
動画のタイトル及び再生時間を文字列で返すコード。
public String Nico_Fetchinfo(Context context,String url,int timeout){
String infourl="";
if (!url.toLowerCase().contains("nicovideo"))
return null;
//sm#の場合とsmなしで#の場合がある
Pattern p = Pattern.compile(".+/sm(\\d+)");
Matcher m = p.matcher(url);
if (m.find()) {
infourl = "http://ext.nicovideo.jp/api/getthumbinfo/sm"+m.group(1);
}else{
p = Pattern.compile(".+/(\\d+)");
m = p.matcher(url);
if (m.find()) {
infourl = "http://ext.nicovideo.jp/api/getthumbinfo/"+m.group(1);
}else
return null;
}
}
int responseCode = 0;
int duration=0;
String sduration="";
String title="";
String movietitle = new String();
try {
String defaultUA = "Mozilla/5.0 (Linux; U; Android 2.1; en-us) AppleWebKit/522+ (KHTML, like Gecko) Safari/419.3";
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(infourl);
HttpResponse httpResponse = null;
httpClient.getParams().setParameter("http.connection.timeout", new Integer(timeout));
HttpParams params1 = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params1, timeout); //接続のタイムアウト
HttpConnectionParams.setSoTimeout(params1, timeout); //データ取得のタイムアウト
params1.setParameter(HttpProtocolParams.USER_AGENT, defaultUA);
httpResponse = httpClient.execute(httpGet);
responseCode = httpResponse.getStatusLine().getStatusCode();
if (responseCode == HttpStatus.SC_OK) {
InputStream istream = httpResponse.getEntity().getContent();
InputStreamReader reader = new InputStreamReader(istream);
BufferedReader objBuf = new BufferedReader(reader);
StringBuilder builder = new StringBuilder();
String sLine;
while((sLine = objBuf.readLine()) != null){
builder.append(sLine);}
String html = builder.toString();
istream.close();
//情報から必要なデータを取り出す
Pattern dp = Pattern.compile("<length>(.*?)</");
Matcher dm = dp.matcher(html);
if (dm.find()) {
try {
sduration = dm.group(1);
}catch(Exception e){duration=0;}
}
Pattern tp = Pattern.compile("<title>(.*?)</");
Matcher tm = tp.matcher(html);
if (tm.find()) {
title = tm.group(1);
if (title.length()>0){
movietitle = title+" ("+sduration+")";
movietitle = movietitle.replace("&","&");
movietitle = movietitle.replace(">","<");
movietitle = movietitle.replace("<",">");
movietitle = movietitle.replace(""","\"");
return movietitle;
}
}
} else if (responseCode == 403){ //forbidden
movietitle = "閲覧規制";
return movietitle;
}
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
return null;
}
サムネイル画像の取得コード。
public String Nico_FetchThumurlinfo(Context context,String url,int timeout){
String infourl="";
if (!url.toLowerCase().contains("nicovideo"))
return null;
Pattern p = Pattern.compile(".+/sm(\\d+)");
Matcher m = p.matcher(url);
if (m.find()) {
infourl = "http://ext.nicovideo.jp/api/getthumbinfo/sm"+m.group(1);
}else{
p = Pattern.compile(".+/(\\d+)");
m = p.matcher(url);
if (m.find()) {
infourl = "http://ext.nicovideo.jp/api/getthumbinfo/"+m.group(1);
}else
return null;
}
int responseCode = 0;
String thumurl = new String();
try {
String defaultUA = "Mozilla/5.0 (Linux; U; Android 2.1; en-us) AppleWebKit/522+ (KHTML, like Gecko) Safari/419.3";
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(infourl);
HttpResponse httpResponse = null;
httpClient.getParams().setParameter("http.connection.timeout", new Integer(timeout));
HttpParams params1 = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params1, timeout); //接続のタイムアウト
HttpConnectionParams.setSoTimeout(params1, timeout); //データ取得のタイムアウト
params1.setParameter(HttpProtocolParams.USER_AGENT, defaultUA);
httpResponse = httpClient.execute(httpGet);
responseCode = httpResponse.getStatusLine().getStatusCode();
if (responseCode == HttpStatus.SC_OK) {
InputStream istream = httpResponse.getEntity().getContent();
InputStreamReader reader = new InputStreamReader(istream);
BufferedReader objBuf = new BufferedReader(reader);
StringBuilder builder = new StringBuilder();
String sLine;
while((sLine = objBuf.readLine()) != null){
builder.append(sLine);}
String html = builder.toString();
istream.close();
Pattern dp = Pattern.compile("<thumbnail_url>(.*?)</");
Matcher dm = dp.matcher(html);
if (dm.find()) {
try {
thumurl = dm.group(1);
return thumurl;
}catch(Exception e){}
}
}
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
return null;
}
public Bitmap Nico_Fetchthum(Context context,String url){
String vid="";
String turl="";
if (!url.toLowerCase().contains("nicovideo"))
return null;
Pattern p = Pattern.compile(".+/sm(\\d+)");
Matcher m = p.matcher(url);
if (m.find()) {
vid = m.group(1);
}else{
p = Pattern.compile(".+/(\\d+)");
m = p.matcher(url);
if (m.find()) {
vid = m.group(1);
turl = "tobefetched";
}else
return null;
}
}
if (vid.length()<2)
return null;
try {
URL imageUrl;
int thindex;
//サムネルURL成形、ビデオ情報からサムネイルURL取得する方法も入れた理由は忘れた
//数字のみのURLの場合サムネイルの場所が違っていたからだったかも
thindex = (Integer.parseInt(vid))%4+1;
if (turl.equals(""))
imageUrl = new URL("http://tn-skr"+thindex+".smilevideo.jp/smile?i="+vid);
else{
turl = VGmark_FetchThumurlinfo(context,url,3000);
if (turl.equals(""))
imageUrl = new URL("http://tn-skr"+thindex+".smilevideo.jp/smile?i="+vid);
else
imageUrl = new URL(turl);
}
}
InputStream imageIs;
imageIs = imageUrl.openStream();
File saveDir;
String filepath;
//キャッシュ用にSDカード内ファイルに保存していますが、必要に応じ別の場所かメモリから直接に変えること
saveDir = new File(Environment.getExternalStorageDirectory().getAbsoluteFile()+"/mymato/videothum/");
filepath = Environment.getExternalStorageDirectory().getAbsoluteFile()+"/mymato/videothum/"+vid+".jpg";
if(!saveDir.exists()) {
if (!saveDir.mkdirs()) { //can't save to file, load to memory
Bitmap image = BitmapFactory.decodeStream(imageIs);
return image;
}
}
File file = new File(filepath);
BufferedInputStream bufferedInputStream = new BufferedInputStream(imageIs, 10240);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file, false), 10240);
byte buffer[] = new byte[10240];
int size = 0;
while(-1 != (size = bufferedInputStream.read(buffer))) {
bufferedOutputStream.write(buffer, 0, size);
}
bufferedOutputStream.flush();
bufferedOutputStream.close();
bufferedInputStream.close();
Bitmap bmSource = BitmapFactory.decodeFile(filepath);
return bmSource;
}catch (MalformedURLException e) {
return null;
} catch (IOException e) {
return null;
}
}


