diff --git a/comictagger.py b/comictagger.py index b7193c8..aa6e943 100755 --- a/comictagger.py +++ b/comictagger.py @@ -320,65 +320,79 @@ def process_file_cli( filename, opts, settings, match_results ): # now, search online if opts.search_online: - - ii = IssueIdentifier( ca, settings ) - - if md is None or md.isEmpty: - print "No metadata given to search online with!" - return - - def myoutput( text ): - if opts.verbose: - IssueIdentifier.defaultWriteOutput( text ) + if opts.issue_id is not None: + # we were given the actual ID to search with + try: + cv_md = ComicVineTalker().fetchIssueDataByIssueID( opts.issue_id, settings ) + except ComicVineTalkerException: + print "Network error while getting issue details. Save aborted" + return None - # use our overlayed MD struct to search - ii.setAdditionalMetadata( md ) - ii.onlyUseAdditionalMetaData = True - ii.setOutputFunction( myoutput ) - ii.cover_page_index = md.getCoverPageIndexList()[0] - matches = ii.search() - - result = ii.search_result - - found_match = False - choices = False - low_confidence = False - - if result == ii.ResultNoMatches: - pass - elif result == ii.ResultFoundMatchButBadCoverScore: - low_confidence = True - found_match = True - elif result == ii.ResultFoundMatchButNotFirstPage : - found_match = True - elif result == ii.ResultMultipleMatchesWithBadImageScores: - low_confidence = True - choices = True - elif result == ii.ResultOneGoodMatch: - found_match = True - elif result == ii.ResultMultipleGoodMatches: - choices = True - - if choices: - print "Online search: Multiple matches. Save aborted" - match_results.multipleMatches.append(MultipleMatch(filename,matches)) - return - if low_confidence and opts.abortOnLowConfidence: - print "Online search: Low confidence match. Save aborted" - match_results.noMatches.append(filename) - return - if not found_match: - print "Online search: No match found. Save aborted" - match_results.noMatches.append(filename) - return - - - # we got here, so we have a single match - - # now get the particular issue data - cv_md = actual_issue_data_fetch(matches[0], settings) - if cv_md is None: - return + if cv_md is None: + print "No match for ID {0} was found.".format(opts.issue_id) + return None + + if settings.apply_cbl_transform_on_cv_import: + cv_md = CBLTransformer( cv_md, settings ).apply() + else: + ii = IssueIdentifier( ca, settings ) + + if md is None or md.isEmpty: + print "No metadata given to search online with!" + return + + def myoutput( text ): + if opts.verbose: + IssueIdentifier.defaultWriteOutput( text ) + + # use our overlayed MD struct to search + ii.setAdditionalMetadata( md ) + ii.onlyUseAdditionalMetaData = True + ii.setOutputFunction( myoutput ) + ii.cover_page_index = md.getCoverPageIndexList()[0] + matches = ii.search() + + result = ii.search_result + + found_match = False + choices = False + low_confidence = False + + if result == ii.ResultNoMatches: + pass + elif result == ii.ResultFoundMatchButBadCoverScore: + low_confidence = True + found_match = True + elif result == ii.ResultFoundMatchButNotFirstPage : + found_match = True + elif result == ii.ResultMultipleMatchesWithBadImageScores: + low_confidence = True + choices = True + elif result == ii.ResultOneGoodMatch: + found_match = True + elif result == ii.ResultMultipleGoodMatches: + choices = True + + if choices: + print "Online search: Multiple matches. Save aborted" + match_results.multipleMatches.append(MultipleMatch(filename,matches)) + return + if low_confidence and opts.abortOnLowConfidence: + print "Online search: Low confidence match. Save aborted" + match_results.noMatches.append(filename) + return + if not found_match: + print "Online search: No match found. Save aborted" + match_results.noMatches.append(filename) + return + + + # we got here, so we have a single match + + # now get the particular issue data + cv_md = actual_issue_data_fetch(matches[0], settings) + if cv_md is None: + return md.overlay( cv_md ) diff --git a/comicvinetalker.py b/comicvinetalker.py index 5407b3e..52533d3 100644 --- a/comicvinetalker.py +++ b/comicvinetalker.py @@ -201,6 +201,29 @@ class ComicVineTalker(QObject): else: return None + # now, map the comicvine data to generic metadata + return self.mapCVDataToMetadata( volume_results, issue_results, settings ) + + def fetchIssueDataByIssueID( self, issue_id, settings ): + + issue_url = "http://api.comicvine.com/issue/" + str(issue_id) + "/?api_key=" + self.api_key + "&format=json" + content = self.getUrlContent(issue_url) + cv_response = json.loads(content) + if cv_response[ 'status_code' ] != 1: + print ( "Comic Vine query failed with error: [{0}]. ".format( cv_response[ 'error' ] )) + return None + + issue_results = cv_response['results'] + + volume_results = self.fetchVolumeData( issue_results['volume']['id'] ) + + # now, map the comicvine data to generic metadata + md = self.mapCVDataToMetadata( volume_results, issue_results, settings ) + md.isEmpty = False + return md + + def mapCVDataToMetadata(self, volume_results, issue_results, settings ): + # now, map the comicvine data to generic metadata metadata = GenericMetadata() diff --git a/options.py b/options.py index c301d90..355e7fd 100644 --- a/options.py +++ b/options.py @@ -69,6 +69,7 @@ If no options are given, {0} will run in windowed mode -o, --online Search online and attempt to identify file using existing metadata and images in archive. May be used in conjuntion with -f and -m + --id=ID Use the issue ID when searching online. Overrides all other metadata -m, --metadata=LIST Explicity define, as a list, some tags to be used e.g. "series=Plastic Man , publisher=Quality Comics" "series=Kickers^, Inc., issue=1, year=1986" @@ -105,6 +106,7 @@ If no options are given, {0} will run in windowed mode self.rename_file = False self.no_overwrite = False self.interactive = False + self.issue_id = None self.file_list = [] def display_msg_and_quit( self, msg, code, show_help=False ): @@ -180,7 +182,7 @@ If no options are given, {0} will run in windowed mode "hpdt:fm:vonsrc:i", [ "help", "print", "delete", "type=", "copy=", "parsefilename", "metadata=", "verbose", "online", "dryrun", "save", "rename" , "raw", "noabort", "terse", "nooverwrite", - "interactive", "nosummary", "version" ]) + "interactive", "nosummary", "version", "id=" ]) except getopt.GetoptError as err: self.display_msg_and_quit( str(err), 2 ) @@ -219,6 +221,8 @@ If no options are given, {0} will run in windowed mode self.rename_file = True if o in ("-f", "--parsefilename"): self.parse_filename = True + if o == "--id": + self.issue_id = a if o == "--raw": self.raw = True if o == "--noabort":