DailymotionのムラムラするスクリプトをPythonで

SoftwareDesign4月号のゆーすけべー氏の記事を見て、触発されたのでなんとなくPythonで書いてみた。
Dailymotionの動画を手に入れてムラムラするスクリプト     http://yusukebe.com/archives/20130116/003123.html

動画の検索

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import urllib
import json
import sys

if __name__ == '__main__':
    if(len(sys.argv) < 2):
        print 'Usage: $ python %s query' % sys.argv[0]
        exit()
    
    query = ''
    for i, argv in enumerate(sys.argv):
        if i > 0:
            query += argv + ' '
    query = query.rstrip()
    
    url = 'http://www.dailymotion.com/'
    #検索実行:jsonを取得
    f = urllib.urlopen(url + 'json/relevance/search/' + query)
    
    #取得したjsonをデコード
    movieInfoList = json.loads(f.read())
    
    for i in movieInfoList:
         print i['title']
         print i['embed_url'] + '\n'

検索結果をjsonで取得して、タイトルとパーマリンクのURLだけ表示させている。


動画のダウンロード

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import urllib
import sys
import json

#ダウンロード時の進捗を表示
def reprthook ( count, size, totalSize):
    progress = 100.0 * count * size / totalSize
    downleadedSize = count * size / 1024
    totalSize = totalSize / 1024
    if progress > 100:
        sys.stdout.write( '%d / %d KB  ( %.2f %% ) \r' % (totalSize, totalSize, 100 ))
    else:    
        sys.stdout.write( '%d / %d KB  ( %.2f %% ) \r' % (downleadedSize , totalSize, progress ))

if __name__ == '__main__':
    if (len(sys.argv) < 2):
        print 'Usage: python %s URI...' % sys.argv[0]
        exit()
    for i, argv in enumerate(sys.argv):
        if i == 0:
            continue
        
        embedUrl = argv
        f = urllib.urlopen(embedUrl)
        content = f.read()
        movieUrl = u''
        fileName = u'blank.mp4'
        titleIndex = content.find('<title>') + len(u'<title>')
        fileName = content[titleIndex:]        
        fileName = fileName[:fileName.find('<')] + '.mp4'

        infoIndex = content.find('var info = ') + len(u'var info = ')
        infoJson = content[infoIndex:]
        infoJson = infoJson[:infoJson.find(',\n')]
        infoDict = json.loads(infoJson)
        #動画ファイルのURLを取得
        movieUrl = infoDict.get('stream_h264_ld_url',
                                infoDict.get('stream_h264_url', ''))
        
        print fileName
        print 'Please wait a moment... '
        #ダウンロード開始
        urllib.urlretrieve(movieUrl, fileName, reprthook)
        print ''
        print 'complete!!\n'

検索時に取得したURLを元に、動画を取得している。
もうちょっときれいにJson受け取れないもんかなぁ。

実行時

$ python getDailyMotionMovie.py <URL>
<filename>.mp4
Please wait a moment... 
44179 / 44179 KB  ( 100.00 % ) 
complete!!

こんな感じ。

ダウンロード時の進捗については、
http://blog.remora.cx/2010/05/download-progress-in-python.html
http://docs.python.jp/2.5/lib/module-urllib.html
を参考にさせてもらいました。