127 lines
4 KiB
Python
Executable file
127 lines
4 KiB
Python
Executable file
#!/usr/bin/env python
|
|
|
|
# import os for file system functions
|
|
import os
|
|
# import json
|
|
import json
|
|
# shutil for file renaming
|
|
import shutil
|
|
import sys
|
|
import time
|
|
import logging
|
|
|
|
# import flickrapi
|
|
# `easy_install flickrapi` or `pip install flickrapi`
|
|
from trovebox import Trovebox, TroveboxError, TroveboxDuplicateError
|
|
|
|
from os.path import join, getsize
|
|
|
|
|
|
# main program
|
|
def import_into_trovebox(client):
|
|
|
|
|
|
for root, dirs, files in os.walk('fetched/'):
|
|
total = len(files)
|
|
current = 1
|
|
processed = 0
|
|
errored = 0
|
|
start_time = time.time()
|
|
print "Found a total of %d files to process" % total
|
|
for i in files:
|
|
print "Processing %d of %d %s ..." % (current, total, i),
|
|
sys.stdout.flush()
|
|
current = current + 1
|
|
infile = "fetched/%s" % i
|
|
f = open(infile, 'r')
|
|
json_str = f.read()
|
|
f.close()
|
|
|
|
shutil.move(infile, "errored/%s" % i)
|
|
|
|
params = json.loads(json_str)
|
|
|
|
# If the upload fails for any reason, an exception will be raised
|
|
try:
|
|
resp = client.post('/photo/upload.json', **params)
|
|
if resp['code'] != 201:
|
|
raise TroveboxError("Unexpected response code: %d: %s"%
|
|
(resp['code'], resp['message']))
|
|
print "OK"
|
|
processed = processed + 1
|
|
shutil.move("errored/%s" % i, "processed/%s" % i)
|
|
|
|
except TroveboxDuplicateError:
|
|
print "DUPLICATE: This photo already exists on the server"
|
|
shutil.move("errored/%s" % i, "duplicates/%s" % i)
|
|
errored = errored + 1
|
|
except TroveboxError as error:
|
|
print "FAILED: %s" % error
|
|
errored = errored + 1
|
|
|
|
sys.stdout.flush()
|
|
|
|
end_time = time.time()
|
|
total_time = (end_time - start_time) / 60.0
|
|
photos_minute = int(total / total_time)
|
|
|
|
if total > 0:
|
|
print "Results. Processed: %d. Errored: %d." % (processed, errored)
|
|
print "Imported %d photos at %d photos/minute." % (total, photos_minute)
|
|
|
|
# create a directory only if it doesn't already exist
|
|
def createDirectorySafe( name ):
|
|
if not os.path.exists(name):
|
|
os.makedirs(name)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import argparse
|
|
|
|
parser = argparse.ArgumentParser(description='Import photos into an Trovebox instance')
|
|
parser.add_argument('--config', help="Configuration file to use")
|
|
parser.add_argument('--host', help="Hostname of the Trovebox server (overrides config_file)")
|
|
parser.add_argument('--consumer-key')
|
|
parser.add_argument('--consumer-secret')
|
|
parser.add_argument('--token')
|
|
parser.add_argument('--token-secret')
|
|
parser.add_argument('--debug', help="Print extra debug information", action="store_true")
|
|
config = parser.parse_args()
|
|
|
|
if config.debug:
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
|
|
# Host option overrides config file settings
|
|
if config.host:
|
|
client = Trovebox(host=config.host, consumer_key=config.consumer_key,
|
|
consumer_secret=config.consumer_secret,
|
|
token=config.token, token_secret=config.token_secret)
|
|
else:
|
|
try:
|
|
client = Trovebox(config_file=config.config)
|
|
except IOError as error:
|
|
print error
|
|
print
|
|
print "You must create a configuration file in ~/.config/trovebox/default"
|
|
print "with the following contents:"
|
|
print " host = your.host.com"
|
|
print " consumerKey = your_consumer_key"
|
|
print " consumerSecret = your_consumer_secret"
|
|
print " token = your_access_token"
|
|
print " tokenSecret = your_access_token_secret"
|
|
print
|
|
print "To get your credentials:"
|
|
print " * Log into your Trovebox site"
|
|
print " * Click the arrow on the top-right and select 'Settings'."
|
|
print " * Click the 'Create a new app' button."
|
|
print " * Click the 'View' link beside the newly created app."
|
|
print
|
|
print error
|
|
sys.exit(1)
|
|
|
|
# check if a processed and errored directories exist else create them
|
|
createDirectorySafe('processed')
|
|
createDirectorySafe('errored')
|
|
createDirectorySafe('duplicates')
|
|
|
|
import_into_trovebox(client)
|