/
circ.py
executable file
·170 lines (146 loc) · 5.11 KB
/
circ.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#!/usr/bin/python
# script for communicating with http://getcirc.com/
#
from __future__ import division
import getopt
import hashlib
import requests
import urllib
import sys
import signal
import os
import datetime
import common
import base64
credentials = common.loadCredentials()
def main():
signal.signal(signal.SIGINT, signal_handler)
try:
opts, args = getopt.getopt(sys.argv[1:], '', ['ls=', 'send=', 'get=', 'delete-all='])
except getopt.GetoptError, err:
print str(err)
usage()
sys.exit(2)
if not opts:
usage()
sys.exit(2)
for option, argument in opts:
if option == '--ls':
print 'Listing ' + argument + '...'
processSets(processFiles, listFile)
if option == '--send':
print 'Sending ' + argument + '...'
uploadDir(argument)
if option == '--get':
print 'Downloading ' + argument + '...'
processSets(processFiles, downloadFile)
if option == '--delete-all':
print 'Deleting all ...'
# deleteSets()
deleteFiles()
def signal_handler(signal, frame):
print '\n Aborting...'
sys.exit(0)
def usage():
print
print 'Usage:'
print ' circ.py <operation> [<files>] [<destination>]'
print
print 'Example: '
print ' circ.py --ls photos/christmas2012 # list all files under photos/christmas2012 on Circ server'
print
print 'Options:'
print ' --ls List files of chosen remote directory'
print ' --send Send local files to Circ'
print ' --get Download remote files/folders to a local folder'
print
def uploadRequestWithToken(method, baseUrl='http://bulk-api.circ.io/2/', **param):
try:
param['access_token'] = credentials['HTTP_ACCESS_TOKEN']
except:
print 'Missing HTTP_ACCESS_TOKEN in ' + common.CREDENTIALS_FILE
sys.exit(2)
result = common.request(method, baseUrl, **param)
try:
return result['response']
except KeyError:
print result
sys.exit(2)
def requestWithToken(method, baseUrl='https://api.circ.io/2/', **param):
try:
param['access_token'] = credentials['ACCESS_TOKEN']
except:
print 'Missing ACCESS_TOKEN in ' + common.CREDENTIALS_FILE
sys.exit(2)
result = common.request(method, baseUrl, **param)
try:
return result['response']
except KeyError:
print result
sys.exit(2)
def ignoreTrash(set):
return set['type'] != 6
def getSets():
return filter(ignoreTrash, requestWithToken('sets'))
def processSets(setOperation, fileOperation):
for set in getSets():
setOperation(set, fileOperation)
def processFiles(set, fileOperation):
files = requestWithToken('sets/files', set_id= set['id'])
for file in files:
fileOperation(file)
def deleteSets():
for set in getSets():
requestWithToken('sets/delete', set_id=set['id'],generation_id=set['generation_id'])
def deleteFiles():
fileIds = ''
print 'Getting file ids...'
for set in getSets():
files = requestWithToken('sets/files', set_id=set['id'])
print 'Found ' + str(len(files)) + ' files in set: ' + str(set['id'])
for file in files:
fileIds += str(file['id']) + ','
if fileIds != '':
print 'Starting delete...'
requestWithToken('files/delete', file_id=fileIds)
print 'All deleted.'
else:
print 'Nothing to delete.'
def listFile(file):
date = datetime.datetime.fromtimestamp(file['date_time_taken']).strftime('%Y-%m-%d %H:%M:%S')
print file['name'] + ' (' + picSize(file['size']) + ', ' + date + ')'
print file
def downloadFile(file):
url = file['media_url'] + '&size=0'
u = urllib.urlopen(url)
localFile = open(file['name'], 'w')
localFile.write(u.read())
localFile.close()
print 'Saved: ' + file['name']
sys.exit(0)
def picSize(size):
res = size['width']*size['height']/1000000
return '%.2f%s' % (res, 'MP')
def upload(filePath, fileName):
uploadUrl = 'http://bulk-api.circ.io/2/upload/'
md5Hash = hashlib.md5(open(filePath, "r").read()).hexdigest()
fileSize = str(os.path.getsize(filePath))
clientSig = hashlib.md5(credentials['CLIENT_SECRET'] + 'access_token' + credentials['HTTP_ACCESS_TOKEN'] + 'file_name' + fileName + 'file_size' + fileSize + 'upload_signature' + md5Hash).hexdigest()
result = uploadRequestWithToken('query', baseUrl=uploadUrl, file_name=fileName, file_size=fileSize, upload_signature=md5Hash, client_sig=clientSig)
print result
clientSig = hashlib.md5(credentials['CLIENT_SECRET'] + 'access_token' + credentials['HTTP_ACCESS_TOKEN'] + 'file_id' + str(result['file_id']) + 'offset' + str(result['offset'])).hexdigest()
files = {'FILE': (fileName, open(filePath, 'rb'))}
url = uploadUrl + 'chunk' + '?access_token=' + credentials['HTTP_ACCESS_TOKEN']
url = url + '&file_id=' + str(result['file_id']) + '&offset=' + str(result['offset']) + '&client_sig=' + clientSig
response = requests.post(url, files=files)
print 'Uploaded chunk'
print response.content
clientSig = hashlib.md5(credentials['CLIENT_SECRET'] + 'access_token' + credentials['HTTP_ACCESS_TOKEN'] + 'file_id' + str(result['file_id']) + 'integrity_digest' + md5Hash).hexdigest()
result = uploadRequestWithToken('finish', baseUrl=uploadUrl, file_id=result['file_id'], integrity_digest=md5Hash, client_sig=clientSig)
print result
def uploadDir(dir):
for currentDir, subDirs, files in os.walk(dir):
for fileName in files:
upload(os.path.join(currentDir, fileName), fileName)
if __name__ == '__main__':
main()