1- import json , os , datetime , re , requests , requests_cache
1+ import json , os , datetime , re , requests , requests_cache , logging
22from urllib .request import urlretrieve
33from urllib .parse import quote_plus , unquote_plus
44from comics .models import Arc , Character , Creator , Team , Publisher , Series , Issue , Roles , Settings
1010class ComicImporter (object ):
1111
1212 def __init__ (self ):
13+ # Setup logging
14+ self .logger = logging .getLogger ('tenma' )
15+
1316 # Setup requests caching
1417 requests_cache .install_cache ('./media/CACHE/comicvine-cache' , expire_after = 1800 )
1518 requests_cache .core .remove_expired_responses ()
@@ -59,10 +62,16 @@ def _process_dir(self, path, excluded):
5962 cvid = self ._find_issue_match (entry .name )
6063 if cvid != '' :
6164 # Process issue with ComicVine
62- self ._process_issue (entry .path , cvid )
65+ try :
66+ self ._process_issue (entry .path , cvid )
67+ except Exception :
68+ self .logger .exception ('An error occurred while processing %s' % entry .path )
6369 else :
6470 # Process issue without ComicVine
65- self ._process_issue_without_cvid (entry .path )
71+ try :
72+ self ._process_issue_without_cvid (entry .path )
73+ except Exception :
74+ self .logger .exception ('An error occurred while processing %s' % entry .path )
6675 else :
6776 self ._process_dir (entry .path , excluded )
6877
@@ -101,6 +110,7 @@ def _find_issue_match(self, filename):
101110 '''
102111
103112 # Initialize response
113+ found_issue = None
104114 cvid = ''
105115
106116 # Attempt to extract series name, issue number, and year
@@ -115,77 +125,100 @@ def _find_issue_match(self, filename):
115125
116126 if matching_series :
117127 if not matching_series [0 ].cvid == '' :
118- cvid = self ._find_match_with_series (matching_series [0 ].cvid , issue_number )
119- if not cvid == '' :
120- return cvid
121-
122- # Query Parameters
123- query_params = self .base_params
124- query_params ['resources' ] = 'issue'
125- query_params ['field_list' ] = self .query_issue_fields
126- query_params ['limit' ] = self .query_issue_limit
127-
128- # Check for series name and issue number, or just series name
129- if series_name and issue_number :
130- query_params ['query' ] = series_name + ' ' + issue_number
131- query_response = requests .get (
132- self .baseurl + 'search' ,
133- params = query_params ,
134- headers = self .headers
135- ).json ()
136- elif series_name :
137- query_params ['query' ] = series_name_url
138- query_response = requests .get (
139- self .baseurl + 'search' ,
140- params = query_params ,
141- headers = self .headers
142- ).json ()
128+ found_issue = self ._find_match_with_series (matching_series [0 ].cvid , issue_number )
143129
144- best_option_list = []
145-
146- # Try to find the closest match.
147- for issue in query_response ['results' ]:
148- item_year = datetime .date .today ().year
149- item_number = 1
150- item_name = ''
151-
152- if 'cover_date' in issue :
153- if issue ['cover_date' ]:
154- item_year = issue ['cover_date' ][0 :4 ]
155- if 'issue_number' in issue :
156- if issue ['issue_number' ]:
157- item_number = issue ['issue_number' ]
158- if 'name' in issue ['volume' ]:
159- if issue ['volume' ]['name' ]:
160- item_name = issue ['volume' ]['name' ]
161- item_name = utils .remove_special_characters (item_name )
130+ if found_issue is None :
131+ # Query Parameters
132+ query_params = self .base_params
133+ query_params ['resources' ] = 'issue'
134+ query_params ['field_list' ] = self .query_issue_fields
135+ query_params ['limit' ] = self .query_issue_limit
162136
137+ # Check for series name and issue number, or just series name
163138 if series_name and issue_number :
164- score = (fuzz .ratio (item_name .lower (), series_name .lower ()) + fuzz .partial_ratio (item_name .lower (), series_name .lower ())) / 2
165- if score >= 90 :
166- if item_number == issue_number :
167- if item_year == issue_year :
168- best_option_list .insert (0 , issue ['id' ])
169- break
170- best_option_list .insert (0 , issue ['id' ])
139+ query_params ['query' ] = series_name + ' ' + issue_number
140+ query_response = requests .get (
141+ self .baseurl + 'search' ,
142+ params = query_params ,
143+ headers = self .headers
144+ ).json ()
145+ elif series_name :
146+ query_params ['query' ] = series_name_url
147+ query_response = requests .get (
148+ self .baseurl + 'search' ,
149+ params = query_params ,
150+ headers = self .headers
151+ ).json ()
152+
153+ best_option_list = []
154+
155+ # Try to find the closest match.
156+ for issue in query_response ['results' ]:
157+ item_year = datetime .date .today ().year
158+ item_number = 1
159+ item_name = ''
160+
161+ if 'cover_date' in issue :
162+ if issue ['cover_date' ]:
163+ item_year = issue ['cover_date' ][0 :4 ]
164+ if 'issue_number' in issue :
165+ if issue ['issue_number' ]:
166+ item_number = issue ['issue_number' ]
167+ if 'name' in issue ['volume' ]:
168+ if issue ['volume' ]['name' ]:
169+ item_name = issue ['volume' ]['name' ]
170+ item_name = utils .remove_special_characters (item_name )
171+
172+ if series_name and issue_number :
173+ score = (fuzz .ratio (item_name .lower (), series_name .lower ()) + fuzz .partial_ratio (item_name .lower (), series_name .lower ())) / 2
174+ if score >= 90 :
175+ if item_number == issue_number :
176+ if item_year == issue_year :
177+ best_option_list .insert (0 , issue )
178+ break
179+ best_option_list .insert (0 , issue )
180+
181+ found_issue = best_option_list [0 ] if best_option_list else None
182+
183+ cvid = found_issue ['id' ] if found_issue else ''
184+
185+ if found_issue is not None :
186+ if 'name' in found_issue ['volume' ]:
187+ if found_issue ['volume' ]['name' ]:
188+ series = found_issue ['volume' ]['name' ]
189+ elif matching_series :
190+ series = matching_series [0 ].name
191+ if 'issue_number' in found_issue :
192+ if found_issue ['issue_number' ]:
193+ number = found_issue ['issue_number' ]
194+ else :
195+ number = ''
196+ self .logger .info ('\" %(filename)s\" was matched on Comic Vine as \" %(series)s - #%(number)s\" (%(CVID)s)' % {
197+ 'filename' : filename ,
198+ 'series' : series ,
199+ 'number' : number ,
200+ 'CVID' : cvid
201+ })
202+ else :
203+ self .logger .warning ('No match was found for \" %s\" on Comic Vine.' % filename )
171204
172- return best_option_list [ 0 ] if best_option_list else ''
205+ return cvid
173206
174207 #==================================================================================================
175208
176209 def _find_match_with_series (self , series_cvid , issue_number ):
177210 '''
178211 Try to retrieve a match based on an existing series name.
179212
180- Returns a ComicVine ID .
213+ Returns an issue from list .
181214 '''
182215
183- issue_cvid = ''
216+ found_issue = None
184217
185218 if issue_number :
186219 # Query Parameters
187220 query_params = self .base_params
188- query_params ['field_list' ] = 'issues'
221+ query_params ['field_list' ] = 'issues,name '
189222
190223 # Attempt to find issue based on extracted Series Name and Issue Number
191224 query_response = requests .get (
@@ -198,9 +231,9 @@ def _find_match_with_series(self, series_cvid, issue_number):
198231 for issue in query_response ['results' ]['issues' ]:
199232 item_number = issue ['issue_number' ] if issue ['issue_number' ] else ''
200233 if item_number == issue_number :
201- issue_cvid = issue [ 'id' ]
234+ found_issue = issue
202235
203- return issue_cvid
236+ return found_issue
204237
205238 #==================================================================================================
206239
@@ -245,6 +278,12 @@ def _process_issue_without_cvid(self, filepath):
245278 else :
246279 self ._reprocess_issue_without_cvid (matching_issue [0 ].id )
247280
281+ self .logger .info ('\" %(filename)s\" was processed successfully as \" %(series)s - #%(number)s\" ' % {
282+ 'filename' : filename ,
283+ 'series' : issue .series .name ,
284+ 'number' : issue .number
285+ })
286+
248287 #==================================================================================================
249288
250289 def _reprocess_issue_without_cvid (self , issue_id ):
@@ -369,6 +408,13 @@ def _process_issue(self, filename, cvid):
369408 else :
370409 issue .teams .add (self ._update_team (matching_team [0 ].id , team ['api_detail_url' ]))
371410
411+ self .logger .info ('\" %(filename)s\" was processed successfully as \" %(series)s - #%(number)s\" (%(CVID)s)' % {
412+ 'filename' : filename ,
413+ 'series' : series .name ,
414+ 'number' : issue .number ,
415+ 'CVID' : issue .cvid
416+ })
417+
372418 #==================================================================================================
373419
374420 def _get_object_data (self , response ):
0 commit comments