diff --git a/src/UnRAR2/UnRARDLL/license.txt b/comictagger/UnRAR2/UnRARDLL/license.txt similarity index 100% rename from src/UnRAR2/UnRARDLL/license.txt rename to comictagger/UnRAR2/UnRARDLL/license.txt diff --git a/src/UnRAR2/UnRARDLL/unrar.dll b/comictagger/UnRAR2/UnRARDLL/unrar.dll similarity index 100% rename from src/UnRAR2/UnRARDLL/unrar.dll rename to comictagger/UnRAR2/UnRARDLL/unrar.dll diff --git a/src/UnRAR2/UnRARDLL/unrar.h b/comictagger/UnRAR2/UnRARDLL/unrar.h similarity index 100% rename from src/UnRAR2/UnRARDLL/unrar.h rename to comictagger/UnRAR2/UnRARDLL/unrar.h diff --git a/src/UnRAR2/UnRARDLL/unrar.lib b/comictagger/UnRAR2/UnRARDLL/unrar.lib similarity index 100% rename from src/UnRAR2/UnRARDLL/unrar.lib rename to comictagger/UnRAR2/UnRARDLL/unrar.lib diff --git a/src/UnRAR2/UnRARDLL/unrardll.txt b/comictagger/UnRAR2/UnRARDLL/unrardll.txt similarity index 100% rename from src/UnRAR2/UnRARDLL/unrardll.txt rename to comictagger/UnRAR2/UnRARDLL/unrardll.txt diff --git a/src/UnRAR2/UnRARDLL/whatsnew.txt b/comictagger/UnRAR2/UnRARDLL/whatsnew.txt similarity index 100% rename from src/UnRAR2/UnRARDLL/whatsnew.txt rename to comictagger/UnRAR2/UnRARDLL/whatsnew.txt diff --git a/src/UnRAR2/UnRARDLL/x64/readme.txt b/comictagger/UnRAR2/UnRARDLL/x64/readme.txt similarity index 100% rename from src/UnRAR2/UnRARDLL/x64/readme.txt rename to comictagger/UnRAR2/UnRARDLL/x64/readme.txt diff --git a/src/UnRAR2/UnRARDLL/x64/unrar64.dll b/comictagger/UnRAR2/UnRARDLL/x64/unrar64.dll similarity index 100% rename from src/UnRAR2/UnRARDLL/x64/unrar64.dll rename to comictagger/UnRAR2/UnRARDLL/x64/unrar64.dll diff --git a/src/UnRAR2/UnRARDLL/x64/unrar64.lib b/comictagger/UnRAR2/UnRARDLL/x64/unrar64.lib similarity index 100% rename from src/UnRAR2/UnRARDLL/x64/unrar64.lib rename to comictagger/UnRAR2/UnRARDLL/x64/unrar64.lib diff --git a/src/UnRAR2/__init__.py b/comictagger/UnRAR2/__init__.py similarity index 100% rename from src/UnRAR2/__init__.py rename to comictagger/UnRAR2/__init__.py diff --git a/src/UnRAR2/rar_exceptions.py b/comictagger/UnRAR2/rar_exceptions.py similarity index 100% rename from src/UnRAR2/rar_exceptions.py rename to comictagger/UnRAR2/rar_exceptions.py diff --git a/src/UnRAR2/test_UnRAR2.py b/comictagger/UnRAR2/test_UnRAR2.py similarity index 100% rename from src/UnRAR2/test_UnRAR2.py rename to comictagger/UnRAR2/test_UnRAR2.py diff --git a/src/UnRAR2/unix.py b/comictagger/UnRAR2/unix.py similarity index 100% rename from src/UnRAR2/unix.py rename to comictagger/UnRAR2/unix.py diff --git a/src/UnRAR2/windows.py b/comictagger/UnRAR2/windows.py similarity index 100% rename from src/UnRAR2/windows.py rename to comictagger/UnRAR2/windows.py diff --git a/comictagger/__init__.py b/comictagger/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/autotagmatchwindow.py b/comictagger/autotagmatchwindow.py similarity index 100% rename from src/autotagmatchwindow.py rename to comictagger/autotagmatchwindow.py diff --git a/src/autotagprogresswindow.py b/comictagger/autotagprogresswindow.py similarity index 100% rename from src/autotagprogresswindow.py rename to comictagger/autotagprogresswindow.py diff --git a/src/autotagstartwindow.py b/comictagger/autotagstartwindow.py similarity index 100% rename from src/autotagstartwindow.py rename to comictagger/autotagstartwindow.py diff --git a/src/cbltransformer.py b/comictagger/cbltransformer.py similarity index 100% rename from src/cbltransformer.py rename to comictagger/cbltransformer.py diff --git a/comictagger/cli.py b/comictagger/cli.py new file mode 100644 index 0000000..4c6691d --- /dev/null +++ b/comictagger/cli.py @@ -0,0 +1,539 @@ +#!/usr/bin/python + +""" +Comic tagger CLI functions +""" + +""" +Copyright 2013 Anthony Beville + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +import sys +import signal +import os +import traceback +import time +from pprint import pprint +import json +import platform +import locale + +filename_encoding = sys.getfilesystemencoding() + +from settings import ComicTaggerSettings +from options import Options, MetaDataStyle +from comicarchive import ComicArchive +from issueidentifier import IssueIdentifier +from genericmetadata import GenericMetadata +from comicvinetalker import ComicVineTalker, ComicVineTalkerException +from filerenamer import FileRenamer +from cbltransformer import CBLTransformer + +import utils +import codecs + +class MultipleMatch(): + def __init__( self, filename, match_list): + self.filename = filename + self.matches = match_list + +class OnlineMatchResults(): + def __init__(self): + self.goodMatches = [] + self.noMatches = [] + self.multipleMatches = [] + self.lowConfidenceMatches = [] + self.writeFailures = [] + self.fetchDataFailures = [] + +#----------------------------- + +def actual_issue_data_fetch( match, settings ): + + # now get the particular issue data + try: + cv_md = ComicVineTalker().fetchIssueData( match['volume_id'], match['issue_number'], settings ) + except ComicVineTalkerException: + print >> sys.stderr, "Network error while getting issue details. Save aborted" + return None + + if settings.apply_cbl_transform_on_cv_import: + cv_md = CBLTransformer( cv_md, settings ).apply() + + return cv_md + +def actual_metadata_save( ca, opts, md ): + + if not opts.dryrun: + # write out the new data + if not ca.writeMetadata( md, opts.data_style ): + print >> sys.stderr,"The tag save seemed to fail!" + return False + else: + print >> sys.stderr,"Save complete." + else: + if opts.terse: + print >> sys.stderr,"dry-run option was set, so nothing was written" + else: + print >> sys.stderr,"dry-run option was set, so nothing was written, but here is the final set of tags:" + print u"{0}".format(md) + return True + +def display_match_set_for_choice( label, match_set, opts, settings ): + print "{0} -- {1}:".format(match_set.filename, label ) + + # sort match list by year + match_set.matches.sort(key=lambda k: k['year']) + + for (counter,m) in enumerate(match_set.matches): + counter += 1 + print u" {0}. {1} #{2} [{3}] ({4}/{5}) - {6}".format(counter, + m['series'], + m['issue_number'], + m['publisher'], + m['month'], + m['year'], + m['issue_title']) + if opts.interactive: + while True: + i = raw_input("Choose a match #, or 's' to skip: ") + if (i.isdigit() and int(i) in range(1,len(match_set.matches)+1)) or i == 's': + break + if i != 's': + i = int(i) - 1 + # save the data! + # we know at this point, that the file is all good to go + ca = ComicArchive( match_set.filename ) + if settings.rar_exe_path != "": + ca.setExternalRarProgram( settings.rar_exe_path ) + md = create_local_metadata( opts, ca, ca.hasMetadata(opts.data_style) ) + cv_md = actual_issue_data_fetch(match_set.matches[int(i)], settings) + md.overlay( cv_md ) + actual_metadata_save( ca, opts, md ) + + +def post_process_matches( match_results, opts, settings ): + # now go through the match results + if opts.show_save_summary: + if len( match_results.goodMatches ) > 0: + print "\nSuccessful matches:" + print "------------------" + for f in match_results.goodMatches: + print f + + if len( match_results.noMatches ) > 0: + print "\nNo matches:" + print "------------------" + for f in match_results.noMatches: + print f + + if len( match_results.writeFailures ) > 0: + print "\nFile Write Failures:" + print "------------------" + for f in match_results.writeFailures: + print f + + if len( match_results.fetchDataFailures ) > 0: + print "\nNetwork Data Fetch Failures:" + print "------------------" + for f in match_results.fetchDataFailures: + print f + + if not opts.show_save_summary and not opts.interactive: + #just quit if we're not interactive or showing the summary + return + + if len( match_results.multipleMatches ) > 0: + print "\nArchives with multiple high-confidence matches:" + print "------------------" + for match_set in match_results.multipleMatches: + display_match_set_for_choice( "Multiple high-confidence matches", match_set, opts, settings ) + + if len( match_results.lowConfidenceMatches ) > 0: + print "\nArchives with low-confidence matches:" + print "------------------" + for match_set in match_results.lowConfidenceMatches: + if len( match_set.matches) == 1: + label = "Single low-confidence match" + else: + label = "Multiple low-confidence matches" + + display_match_set_for_choice( label, match_set, opts, settings ) + + +def cli_mode( opts, settings ): + if len( opts.file_list ) < 1: + print >> sys.stderr,"You must specify at least one filename. Use the -h option for more info" + return + + match_results = OnlineMatchResults() + + for f in opts.file_list: + f = f.decode(filename_encoding, 'replace') + process_file_cli( f, opts, settings, match_results ) + sys.stdout.flush() + + post_process_matches( match_results, opts, settings ) + + +def create_local_metadata( opts, ca, has_desired_tags ): + + md = GenericMetadata() + md.setDefaultPageList( ca.getNumberOfPages() ) + + if has_desired_tags: + md = ca.readMetadata( opts.data_style ) + + # now, overlay the parsed filename info + if opts.parse_filename: + md.overlay( ca.metadataFromFilename() ) + + # finally, use explicit stuff + if opts.metadata is not None: + md.overlay( opts.metadata ) + + return md + +def process_file_cli( filename, opts, settings, match_results ): + + batch_mode = len( opts.file_list ) > 1 + + ca = ComicArchive(filename) + if settings.rar_exe_path != "": + ca.setExternalRarProgram( settings.rar_exe_path ) + + if not os.path.lexists( filename ): + print >> sys.stderr,"Cannot find "+ filename + return + + if not ca.seemsToBeAComicArchive(): + print >> sys.stderr,"Sorry, but "+ filename + " is not a comic archive!" + return + + #if not ca.isWritableForStyle( opts.data_style ) and ( opts.delete_tags or opts.save_tags or opts.rename_file ): + if not ca.isWritable( ) and ( opts.delete_tags or opts.copy_tags or opts.save_tags or opts.rename_file ): + print >> sys.stderr,"This archive is not writable for that tag type" + return + + has = [ False, False, False ] + if ca.hasCIX(): has[ MetaDataStyle.CIX ] = True + if ca.hasCBI(): has[ MetaDataStyle.CBI ] = True + if ca.hasCoMet(): has[ MetaDataStyle.COMET ] = True + + if opts.print_tags: + + + if opts.data_style is None: + page_count = ca.getNumberOfPages() + + brief = "" + + if batch_mode: + brief = "{0}: ".format(filename) + + if ca.isZip(): brief += "ZIP archive " + elif ca.isRar(): brief += "RAR archive " + elif ca.isFolder(): brief += "Folder archive " + + brief += "({0: >3} pages)".format(page_count) + brief += " tags:[ " + + if not ( has[ MetaDataStyle.CBI ] or has[ MetaDataStyle.CIX ] or has[ MetaDataStyle.COMET ] ): + brief += "none " + else: + if has[ MetaDataStyle.CBI ]: brief += "CBL " + if has[ MetaDataStyle.CIX ]: brief += "CR " + if has[ MetaDataStyle.COMET ]: brief += "CoMet " + brief += "]" + + print brief + + if opts.terse: + return + + print + + if opts.data_style is None or opts.data_style == MetaDataStyle.CIX: + if has[ MetaDataStyle.CIX ]: + print "------ComicRack tags--------" + if opts.raw: + print u"{0}".format(unicode(ca.readRawCIX(), errors='ignore')) + else: + print u"{0}".format(ca.readCIX()) + + if opts.data_style is None or opts.data_style == MetaDataStyle.CBI: + if has[ MetaDataStyle.CBI ]: + print "------ComicBookLover tags--------" + if opts.raw: + pprint(json.loads(ca.readRawCBI())) + else: + print u"{0}".format(ca.readCBI()) + + if opts.data_style is None or opts.data_style == MetaDataStyle.COMET: + if has[ MetaDataStyle.COMET ]: + print "------CoMet tags--------" + if opts.raw: + print u"{0}".format(ca.readRawCoMet()) + else: + print u"{0}".format(ca.readCoMet()) + + + elif opts.delete_tags: + style_name = MetaDataStyle.name[ opts.data_style ] + if has[ opts.data_style ]: + if not opts.dryrun: + if not ca.removeMetadata( opts.data_style ): + print "{0}: Tag removal seemed to fail!".format( filename ) + else: + print "{0}: Removed {1} tags.".format( filename, style_name ) + else: + print "{0}: dry-run. {1} tags not removed".format( filename, style_name ) + else: + print "{0}: This archive doesn't have {1} tags to remove.".format( filename, style_name ) + + elif opts.copy_tags: + dst_style_name = MetaDataStyle.name[ opts.data_style ] + if opts.no_overwrite and has[ opts.data_style ]: + print "{0}: Already has {1} tags. Not overwriting.".format(filename, dst_style_name) + return + if opts.copy_source == opts.data_style: + print "{0}: Destination and source are same: {1}. Nothing to do.".format(filename, dst_style_name) + return + + src_style_name = MetaDataStyle.name[ opts.copy_source ] + if has[ opts.copy_source ]: + if not opts.dryrun: + md = ca.readMetadata( opts.copy_source ) + + if settings.apply_cbl_transform_on_bulk_operation and opts.data_style == MetaDataStyle.CBI: + md = CBLTransformer( md, settings ).apply() + + if not ca.writeMetadata( md, opts.data_style ): + print u"{0}: Tag copy seemed to fail!".format( filename ) + else: + print u"{0}: Copied {1} tags to {2} .".format( filename, src_style_name, dst_style_name ) + else: + print u"{0}: dry-run. {1} tags not copied".format( filename, src_style_name ) + else: + print u"{0}: This archive doesn't have {1} tags to copy.".format( filename, src_style_name ) + + + elif opts.save_tags: + + if opts.no_overwrite and has[ opts.data_style ]: + print u"{0}: Already has {1} tags. Not overwriting.".format(filename, MetaDataStyle.name[ opts.data_style ]) + return + + if batch_mode: + print u"Processing {0}...".format(filename) + + md = create_local_metadata( opts, ca, has[ opts.data_style ] ) + + # now, search online + if opts.search_online: + 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 >> sys.stderr,"Network error while getting issue details. Save aborted" + match_results.fetchDataFailures.append(filename) + return + + if cv_md is None: + print >> sys.stderr,"No match for ID {0} was found.".format(opts.issue_id) + match_results.noMatches.append(filename) + return + + 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 >> sys.stderr,"No metadata given to search online with!" + match_results.noMatches.append(filename) + 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: + if low_confidence: + print >> sys.stderr,"Online search: Multiple low confidence matches. Save aborted" + match_results.lowConfidenceMatches.append(MultipleMatch(filename,matches)) + return + else: + print >> sys.stderr,"Online search: Multiple good matches. Save aborted" + match_results.multipleMatches.append(MultipleMatch(filename,matches)) + return + if low_confidence and opts.abortOnLowConfidence: + print >> sys.stderr,"Online search: Low confidence match. Save aborted" + match_results.lowConfidenceMatches.append(MultipleMatch(filename,matches)) + return + if not found_match: + print >> sys.stderr,"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: + match_results.fetchDataFailures.append(filename) + return + + md.overlay( cv_md ) + + # ok, done building our metadata. time to save + if not actual_metadata_save( ca, opts, md ): + match_results.writeFailures.append(filename) + else: + match_results.goodMatches.append(filename) + + elif opts.rename_file: + + msg_hdr = "" + if batch_mode: + msg_hdr = u"{0}: ".format(filename) + + if opts.data_style is not None: + use_tags = has[ opts.data_style ] + else: + use_tags = False + + md = create_local_metadata( opts, ca, use_tags ) + + if md.series is None: + print >> sys.stderr, msg_hdr + "Can't rename without series name" + return + + new_ext = None # default + if settings.rename_extension_based_on_archive: + if ca.isZip(): + new_ext = ".cbz" + elif ca.isRar(): + new_ext = ".cbr" + + renamer = FileRenamer( md ) + renamer.setTemplate( settings.rename_template ) + renamer.setIssueZeroPadding( settings.rename_issue_number_padding ) + renamer.setSmartCleanup( settings.rename_use_smart_string_cleanup ) + + new_name = renamer.determineName( filename, ext=new_ext ) + + if new_name == os.path.basename(filename): + print >> sys.stderr, msg_hdr + "Filename is already good!" + return + + folder = os.path.dirname( os.path.abspath( filename ) ) + new_abs_path = utils.unique_file( os.path.join( folder, new_name ) ) + + suffix = "" + if not opts.dryrun: + # rename the file + os.rename( filename, new_abs_path ) + else: + suffix = " (dry-run, no change)" + + print u"renamed '{0}' -> '{1}' {2}".format(os.path.basename(filename), new_name, suffix) + + elif opts.export_to_zip: + msg_hdr = "" + if batch_mode: + msg_hdr = u"{0}: ".format(filename) + + if not ca.isRar(): + print >> sys.stderr, msg_hdr + "Archive is not a RAR." + return + + rar_file = os.path.abspath( os.path.abspath( filename ) ) + new_file = os.path.splitext(rar_file)[0] + ".cbz" + + if opts.abort_export_on_conflict and os.path.lexists( new_file ): + print msg_hdr + "{0} already exists in the that folder.".format(os.path.split(new_file)[1]) + return + + new_file = utils.unique_file( os.path.join( new_file ) ) + + delete_success = False + export_success = False + if not opts.dryrun: + if ca.exportAsZip( new_file ): + export_success = True + if opts.delete_rar_after_export: + try: + os.unlink( rar_file ) + except: + print >> sys.stderr, msg_hdr + "Error deleting original RAR after export" + delete_success = False + else: + delete_success = True + else: + # last export failed, so remove the zip, if it exists + if os.path.lexists( new_file ): + os.remove( new_file ) + else: + msg = msg_hdr + u"Dry-run: Would try to create {0}".format(os.path.split(new_file)[1]) + if opts.delete_rar_after_export: + msg += u" and delete orginal." + print msg + return + + msg = msg_hdr + if export_success: + msg += u"Archive exported successfully to: {0}".format( os.path.split(new_file)[1] ) + if opts.delete_rar_after_export and delete_success: + msg += u" (Original deleted) " + else: + msg += u"Archive failed to export!" + + print msg + + + + + diff --git a/src/comet.py b/comictagger/comet.py similarity index 100% rename from src/comet.py rename to comictagger/comet.py diff --git a/src/comicarchive.py b/comictagger/comicarchive.py similarity index 100% rename from src/comicarchive.py rename to comictagger/comicarchive.py diff --git a/src/comicbookinfo.py b/comictagger/comicbookinfo.py similarity index 100% rename from src/comicbookinfo.py rename to comictagger/comicbookinfo.py diff --git a/src/comicinfoxml.py b/comictagger/comicinfoxml.py similarity index 100% rename from src/comicinfoxml.py rename to comictagger/comicinfoxml.py diff --git a/src/comictagger.py b/comictagger/comictagger.py similarity index 100% rename from src/comictagger.py rename to comictagger/comictagger.py diff --git a/src/comicvinecacher.py b/comictagger/comicvinecacher.py similarity index 100% rename from src/comicvinecacher.py rename to comictagger/comicvinecacher.py diff --git a/src/comicvinetalker.py b/comictagger/comicvinetalker.py similarity index 100% rename from src/comicvinetalker.py rename to comictagger/comicvinetalker.py diff --git a/src/coverimagewidget.py b/comictagger/coverimagewidget.py similarity index 100% rename from src/coverimagewidget.py rename to comictagger/coverimagewidget.py diff --git a/src/crediteditorwindow.py b/comictagger/crediteditorwindow.py similarity index 100% rename from src/crediteditorwindow.py rename to comictagger/crediteditorwindow.py diff --git a/src/ctversion.py b/comictagger/ctversion.py similarity index 100% rename from src/ctversion.py rename to comictagger/ctversion.py diff --git a/src/exportwindow.py b/comictagger/exportwindow.py similarity index 100% rename from src/exportwindow.py rename to comictagger/exportwindow.py diff --git a/src/filenameparser.py b/comictagger/filenameparser.py similarity index 100% rename from src/filenameparser.py rename to comictagger/filenameparser.py diff --git a/src/filerenamer.py b/comictagger/filerenamer.py similarity index 100% rename from src/filerenamer.py rename to comictagger/filerenamer.py diff --git a/src/fileselectionlist.py b/comictagger/fileselectionlist.py similarity index 100% rename from src/fileselectionlist.py rename to comictagger/fileselectionlist.py diff --git a/src/genericmetadata.py b/comictagger/genericmetadata.py similarity index 100% rename from src/genericmetadata.py rename to comictagger/genericmetadata.py diff --git a/graphics/about.png b/comictagger/graphics/about.png similarity index 100% rename from graphics/about.png rename to comictagger/graphics/about.png diff --git a/graphics/app.png b/comictagger/graphics/app.png similarity index 100% rename from graphics/app.png rename to comictagger/graphics/app.png diff --git a/graphics/auto.png b/comictagger/graphics/auto.png similarity index 100% rename from graphics/auto.png rename to comictagger/graphics/auto.png diff --git a/graphics/autotag.png b/comictagger/graphics/autotag.png similarity index 100% rename from graphics/autotag.png rename to comictagger/graphics/autotag.png diff --git a/graphics/browse.png b/comictagger/graphics/browse.png similarity index 100% rename from graphics/browse.png rename to comictagger/graphics/browse.png diff --git a/graphics/clear.png b/comictagger/graphics/clear.png similarity index 100% rename from graphics/clear.png rename to comictagger/graphics/clear.png diff --git a/graphics/left.png b/comictagger/graphics/left.png similarity index 100% rename from graphics/left.png rename to comictagger/graphics/left.png diff --git a/graphics/longbox.png b/comictagger/graphics/longbox.png similarity index 100% rename from graphics/longbox.png rename to comictagger/graphics/longbox.png diff --git a/graphics/nocover.png b/comictagger/graphics/nocover.png similarity index 100% rename from graphics/nocover.png rename to comictagger/graphics/nocover.png diff --git a/graphics/open.png b/comictagger/graphics/open.png similarity index 100% rename from graphics/open.png rename to comictagger/graphics/open.png diff --git a/graphics/parse.png b/comictagger/graphics/parse.png similarity index 100% rename from graphics/parse.png rename to comictagger/graphics/parse.png diff --git a/graphics/popup_bg.png b/comictagger/graphics/popup_bg.png similarity index 100% rename from graphics/popup_bg.png rename to comictagger/graphics/popup_bg.png diff --git a/graphics/right.png b/comictagger/graphics/right.png similarity index 100% rename from graphics/right.png rename to comictagger/graphics/right.png diff --git a/graphics/save.png b/comictagger/graphics/save.png similarity index 100% rename from graphics/save.png rename to comictagger/graphics/save.png diff --git a/graphics/search.png b/comictagger/graphics/search.png similarity index 100% rename from graphics/search.png rename to comictagger/graphics/search.png diff --git a/graphics/tags.png b/comictagger/graphics/tags.png similarity index 100% rename from graphics/tags.png rename to comictagger/graphics/tags.png diff --git a/src/imagefetcher.py b/comictagger/imagefetcher.py similarity index 100% rename from src/imagefetcher.py rename to comictagger/imagefetcher.py diff --git a/src/imagehasher.py b/comictagger/imagehasher.py similarity index 100% rename from src/imagehasher.py rename to comictagger/imagehasher.py diff --git a/src/imagepopup.py b/comictagger/imagepopup.py similarity index 100% rename from src/imagepopup.py rename to comictagger/imagepopup.py diff --git a/src/issueidentifier.py b/comictagger/issueidentifier.py similarity index 100% rename from src/issueidentifier.py rename to comictagger/issueidentifier.py diff --git a/src/issueselectionwindow.py b/comictagger/issueselectionwindow.py similarity index 100% rename from src/issueselectionwindow.py rename to comictagger/issueselectionwindow.py diff --git a/src/issuestring.py b/comictagger/issuestring.py similarity index 100% rename from src/issuestring.py rename to comictagger/issuestring.py diff --git a/src/logwindow.py b/comictagger/logwindow.py similarity index 100% rename from src/logwindow.py rename to comictagger/logwindow.py diff --git a/src/matchselectionwindow.py b/comictagger/matchselectionwindow.py similarity index 100% rename from src/matchselectionwindow.py rename to comictagger/matchselectionwindow.py diff --git a/src/optionalmsgdialog.py b/comictagger/optionalmsgdialog.py similarity index 100% rename from src/optionalmsgdialog.py rename to comictagger/optionalmsgdialog.py diff --git a/src/options.py b/comictagger/options.py similarity index 100% rename from src/options.py rename to comictagger/options.py diff --git a/src/pagebrowser.py b/comictagger/pagebrowser.py similarity index 100% rename from src/pagebrowser.py rename to comictagger/pagebrowser.py diff --git a/src/pagelisteditor.py b/comictagger/pagelisteditor.py similarity index 100% rename from src/pagelisteditor.py rename to comictagger/pagelisteditor.py diff --git a/src/pageloader.py b/comictagger/pageloader.py similarity index 100% rename from src/pageloader.py rename to comictagger/pageloader.py diff --git a/src/progresswindow.py b/comictagger/progresswindow.py similarity index 100% rename from src/progresswindow.py rename to comictagger/progresswindow.py diff --git a/src/renamewindow.py b/comictagger/renamewindow.py similarity index 100% rename from src/renamewindow.py rename to comictagger/renamewindow.py diff --git a/src/settings.py b/comictagger/settings.py similarity index 96% rename from src/settings.py rename to comictagger/settings.py index 1bdceea..37693f4 100644 --- a/src/settings.py +++ b/comictagger/settings.py @@ -45,11 +45,17 @@ class ComicTaggerSettings: @staticmethod def getGraphic( filename ): - return os.path.join(ComicTaggerSettings.baseDir(), '..', 'graphics', filename ) + graphic_folder = os.path.join(ComicTaggerSettings.baseDir(), '..', 'graphics') + if not os.path.exists(graphic_folder): + graphic_folder = os.path.join(ComicTaggerSettings.baseDir(), 'graphics') + return os.path.join( graphic_folder, filename ) @staticmethod def getUIFile( filename ): - return os.path.join(ComicTaggerSettings.baseDir(), '..', 'ui', filename ) + ui_folder = os.path.join(ComicTaggerSettings.baseDir(), '..', 'ui') + if not os.path.exists(ui_folder): + ui_folder = os.path.join(ComicTaggerSettings.baseDir(), 'ui') + return os.path.join( ui_folder, filename ) def setDefaultValues( self ): diff --git a/src/settingswindow.py b/comictagger/settingswindow.py similarity index 100% rename from src/settingswindow.py rename to comictagger/settingswindow.py diff --git a/src/taggerwindow.py b/comictagger/taggerwindow.py similarity index 100% rename from src/taggerwindow.py rename to comictagger/taggerwindow.py diff --git a/ui/autotagmatchwindow.ui b/comictagger/ui/autotagmatchwindow.ui similarity index 100% rename from ui/autotagmatchwindow.ui rename to comictagger/ui/autotagmatchwindow.ui diff --git a/ui/autotagprogresswindow.ui b/comictagger/ui/autotagprogresswindow.ui similarity index 100% rename from ui/autotagprogresswindow.ui rename to comictagger/ui/autotagprogresswindow.ui diff --git a/ui/autotagstartwindow.ui b/comictagger/ui/autotagstartwindow.ui similarity index 100% rename from ui/autotagstartwindow.ui rename to comictagger/ui/autotagstartwindow.ui diff --git a/ui/coverimagewidget.ui b/comictagger/ui/coverimagewidget.ui similarity index 100% rename from ui/coverimagewidget.ui rename to comictagger/ui/coverimagewidget.ui diff --git a/ui/crediteditorwindow.ui b/comictagger/ui/crediteditorwindow.ui similarity index 100% rename from ui/crediteditorwindow.ui rename to comictagger/ui/crediteditorwindow.ui diff --git a/ui/exportwindow.ui b/comictagger/ui/exportwindow.ui similarity index 100% rename from ui/exportwindow.ui rename to comictagger/ui/exportwindow.ui diff --git a/ui/fileselectionlist.ui b/comictagger/ui/fileselectionlist.ui similarity index 100% rename from ui/fileselectionlist.ui rename to comictagger/ui/fileselectionlist.ui diff --git a/ui/imagepopup.ui b/comictagger/ui/imagepopup.ui similarity index 100% rename from ui/imagepopup.ui rename to comictagger/ui/imagepopup.ui diff --git a/ui/issueselectionwindow.ui b/comictagger/ui/issueselectionwindow.ui similarity index 100% rename from ui/issueselectionwindow.ui rename to comictagger/ui/issueselectionwindow.ui diff --git a/ui/logwindow.ui b/comictagger/ui/logwindow.ui similarity index 100% rename from ui/logwindow.ui rename to comictagger/ui/logwindow.ui diff --git a/ui/matchselectionwindow.ui b/comictagger/ui/matchselectionwindow.ui similarity index 100% rename from ui/matchselectionwindow.ui rename to comictagger/ui/matchselectionwindow.ui diff --git a/ui/pagebrowser.ui b/comictagger/ui/pagebrowser.ui similarity index 100% rename from ui/pagebrowser.ui rename to comictagger/ui/pagebrowser.ui diff --git a/ui/pagelisteditor.ui b/comictagger/ui/pagelisteditor.ui similarity index 100% rename from ui/pagelisteditor.ui rename to comictagger/ui/pagelisteditor.ui diff --git a/ui/progresswindow.ui b/comictagger/ui/progresswindow.ui similarity index 100% rename from ui/progresswindow.ui rename to comictagger/ui/progresswindow.ui diff --git a/ui/renamewindow.ui b/comictagger/ui/renamewindow.ui similarity index 100% rename from ui/renamewindow.ui rename to comictagger/ui/renamewindow.ui diff --git a/ui/settingswindow.ui b/comictagger/ui/settingswindow.ui similarity index 100% rename from ui/settingswindow.ui rename to comictagger/ui/settingswindow.ui diff --git a/ui/taggerwindow.ui b/comictagger/ui/taggerwindow.ui similarity index 100% rename from ui/taggerwindow.ui rename to comictagger/ui/taggerwindow.ui diff --git a/ui/volumeselectionwindow.ui b/comictagger/ui/volumeselectionwindow.ui similarity index 100% rename from ui/volumeselectionwindow.ui rename to comictagger/ui/volumeselectionwindow.ui diff --git a/src/utils.py b/comictagger/utils.py similarity index 100% rename from src/utils.py rename to comictagger/utils.py diff --git a/src/volumeselectionwindow.py b/comictagger/volumeselectionwindow.py similarity index 100% rename from src/volumeselectionwindow.py rename to comictagger/volumeselectionwindow.py