-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathimgur.py
155 lines (133 loc) · 4.88 KB
/
imgur.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
#-------------------------------------------------------------------------------
# Name: module1
# Purpose:
#
# Author: User
#
# Created: 15/06/2015
# Copyright: (c) User 2015
# Licence: <your licence>
#-------------------------------------------------------------------------------
import logging
import imgurpython# Imgur API
from imgurpython.helpers.error import ImgurClientError
from utils import *
import sql_functions
import image_handlers
import config
def get_imgur_client(max_attempts=10):
"""Wrap imgur client setup to make it more fault-tolerant"""
attempt_counter = 0
while attempt_counter <= max_attempts:
attempt_counter += 1
try:
client = imgurpython.ImgurClient(config.imgur_client_id, config.imgur_client_secret)
return client
except ImgurClientError, err:
logging.exception(err)
logging.error("err:"+repr(err))
continue
return None
def save_album(session,album_link):
"""Save the contents of an album"""
# Extract album ID
# http://imgur.com/a/AMibi#0
album_id_search = re.search("""imgur.com/a/([a-zA-Z0-9]+)""", album_link, re.DOTALL)
if album_id_search:
album_id = album_id_search.group(1)
else:
logging.error("Could not parse album link! "+repr(album_link))
assert(False)# we need to fix things if this happens
try:
# Load album from API
client = get_imgur_client(max_attempts=10)
if client is None:# Handle failure to setup client
return []
album = client.get_album(album_id)
except ImgurClientError, err:
logging.exception(err)
logging.error("err:"+repr(err))
return []# Empty because the album cant be retreived
# Download each image in the album
media_id_list = []
for image in album.images:
media_url = image["link"]
media_id_list += image_handlers.download_image_link(session,media_url)
return media_id_list
def save_imgur_images(session,link):
"""Process a url and save the image ids from it"""
# http://imgur.com/UQ1j8OT,2PvFmxV#1
# Grab image ids
# imgur.com/([a-zA-Z0-9,]+)
image_id_search = re.search("""imgur.com/([a-zA-Z0-9,]+)""", link, re.DOTALL)
if image_id_search:
unprocessed_image_ids = image_id_search.group(1)
elif (link[-10:] == "imgur.com/"):# Handle links that are to imgur non-image pages
logging.debug("Link is to an imgur non-image page, skipping: "+repr(link))
return []
else:
logging.error("Could not parse image(s) link! "+repr(link))
assert(False)# we need to fix things if this happens
# Split image ids
image_ids = unprocessed_image_ids.split(",")
logging.debug("save_imgur_images() image_ids:"+repr(image_ids))
# Initialise client
client = get_imgur_client(max_attempts=10)
if client is None:# Handle failure to setup client
return []
# Process each image id
media_id_list = []
for image_id in image_ids:
try:
logging.debug("save_imgur_images() image_id:"+repr(image_id))
image = client.get_image(image_id)
media_url = image.link
media_id_list += image_handlers.download_image_link(session,media_url)
except ImgurClientError, err:
logging.exception(err)
logging.error("err:"+repr(err))
return media_id_list
def save_imgur(session,link):
"""Save any imgur link"""
logging.debug("Handling imgur link:"+repr(link))
# Check if album
# http://imgur.com/a/AMibi#0
if "imgur.com/a/" in link:
return save_album(session,link)
# Check if multiple image ids in url
return save_imgur_images(session,link)
# Let us know if we fail to process a link
def debug():
"""For WIP, debug, ect function calls"""
session = sql_functions.connect_to_db()
print "foo"
# Album
album_media_id_list = save_album(
session,
album_link = "http://imgur.com/a/AMibi#0"
)
logging.debug("album_media_id_list:"+repr(album_media_id_list))
# Multiple image link
multiple_image_link_media_id_list = save_imgur(
session,
link = "http://imgur.com/UQ1j8OT,2PvFmxV#1"
)
logging.debug("multiple_image_link_media_id_list:"+repr(multiple_image_link_media_id_list))
# Single image link
single_image_link_media_id_list = save_imgur(
session,
link = "http://imgur.com/UQ1j8OT"
)
logging.debug("single_image_link_media_id_list:"+repr(single_image_link_media_id_list))
logging.debug(repr(locals()))
return
def main():
try:
setup_logging(log_file_path=os.path.join("debug","imgur_handler_log.txt"))
debug()
except Exception, e:# Log fatal exceptions
logging.critical("Unhandled exception!")
logging.exception(e)
return
if __name__ == '__main__':
main()