flikr に大量ファイルをupload2012/02/24 07:09

flickrに大量画像ファイルを転送
フリーでflickrのページ配られているuploadは 1000個のファイルをuploadできなかったので pythonで
googleでググってパクッた。python2.7で動いた。3000個のファイルを扱った。

必要な物

 pythonのPackage flickrapi

 flickrのAPI KEY <−取得は全て英語でflickr servicesから取得
API_KEY、API_SECRETがある

from __future__ import with_statement
import sys
import os
import threading
import time
import re
import flickrapi
API_KEY = '*********************************'
API_SECRET = '**********************''

PAT_EXT = re.compile(r'\.(jpg|jpeg|avi)', re.I)
pict_dir = '.'

class UploadWorker(threading.Thread):
"""
"""
def __init__(self, flickr, files, lock, name=None, args=(), kwargs={}):
"""コンストラクタ"""
super(UploadWorker, self).__init__()
self.flickr = flickr
self.files = files
self.lock = lock

def _pop_file(self):
"""
"""
with self.lock:
try:
f = self.files.pop()
except IndexError:
f = None
return f

def run(self):
"""
"""
while True:
f = self._pop_file()
if f is None:
break

print "[%s] Upload start: %s" % (self.getName(), f)
try:
self.flickr.upload(os.path.join(pict_dir, f), is_public=0, is_family=0, is_friend=0,tags="****")
except:
print "[%s] Failed... Skip" % self.getName()
else:
print "[%s] OK: %s" % (self.getName(), f)


def init_flickr():
"""Initialize and authenticate FlickrAPI"""
flickr = flickrapi.FlickrAPI(API_KEY, API_SECRET)
(token, frob) = flickr.get_token_part_one(perms='write')
if not token: raw_input("Press ENTER after you authorized this program")
flickr.get_token_part_two((token, frob))
return flickr

def main():
"""
"""
# 画像ディレクトリ設定
global pict_dir
if len(sys.argv) > 1:
pict_dir = sys.argv[1]

# 画像ファイル名取得
files = [f for f in os.listdir(pict_dir) if not f.startswith('.') and PAT_EXT.search(f)]
if len(files) == 0:
print "No files in the directory."
sys.exit()
print "File num: %s" % len(files)

# Flickr API 初期化 & 認証
flickr = init_flickr()

# アップロード
lock = threading.Lock()
workers = []
for i in xrange(5):
w = UploadWorker(flickr, files, lock)
workers.append(w)
w.start()

# 処理終了待ち
for w in workers:
w.join()
print 'Done.'

def _test():
import doctest
doctest.testmod()

if __name__ == '__main__':
main()

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
下記の文字を入力して下さい(半角スペースあります)
Hoge desu

コメント:

トラックバック