diff --git a/comicarchive.py b/comicarchive.py index 2977034..e470f76 100644 --- a/comicarchive.py +++ b/comicarchive.py @@ -121,7 +121,7 @@ class ComicArchive: elif style == MetaDataStyle.CBI: self.writeCBI( metadata ) - def hasMetadata( self, syle ): + def hasMetadata( self, style ): if style == MetaDataStyle.CIX: return self.hasCIX() @@ -130,8 +130,11 @@ class ComicArchive: else: return False - def clearMetadata( self, style ): - return + def removeMetadata( self, style ): + if style == MetaDataStyle.CIX: + self.removeCIX() + elif style == MetaDataStyle.CBI: + self.removeCBI() def getCoverPage(self): @@ -185,6 +188,10 @@ class ComicArchive: cbi_string = ComicBookInfo().stringFromMetadata( metadata ) writeZipComment( self.path, cbi_string ) + def removeCBI( self ): + print "ATB --->removing CBI" + writeZipComment( self.path, "" ) + def readCIX( self ): # !!!ATB TODO add support for folders @@ -202,15 +209,22 @@ class ComicArchive: def writeCIX(self, metadata): + # Passing in None for metadata will remove the CIX file from the archive + # !!!ATB TODO add support for folders if (not self.isZip()): print self.path, "isn't a zip archive!" return - cix_string = ComicInfoXml().stringFromMetadata( metadata ) + if metadata == None: + cix_string = "" + copy_cix = False + else: + cix_string = ComicInfoXml().stringFromMetadata( metadata ) + copy_cix = True # check if an XML file already exists in archive - if not self.hasCIX(): + if not self.hasCIX() and copy_cix: #simple case: just add the new archive file zf = zipfile.ZipFile(self.path, mode='a', compression=zipfile.ZIP_DEFLATED ) @@ -230,8 +244,9 @@ class ComicArchive: if ( item.filename != self.ci_xml_filename ): zout.writestr(item, buffer) - # now write out the new xml file - zout.writestr( self.ci_xml_filename, cix_string ) + # now write out the new xml file, if there is one + if copy_cix: + zout.writestr( self.ci_xml_filename, cix_string ) #preserve the old comment zout.comment = zin.comment @@ -242,7 +257,12 @@ class ComicArchive: # replace with the new file os.remove( self.path ) os.rename( 'tmpnew.zip', self.path ) - + + def removeCIX( self ): + + self.writeCIX( None ) + + def hasCIX(self): has = False diff --git a/options.py b/options.py index 40e0957..c9d1787 100644 --- a/options.py +++ b/options.py @@ -11,6 +11,7 @@ class Enum(set): class MetaDataStyle: CBI = 0 CIX = 1 + name = [ 'ComicBookLover', 'ComicRack' ] class Options: diff --git a/taggerwindow.py b/taggerwindow.py index 3be2f76..713f347 100644 --- a/taggerwindow.py +++ b/taggerwindow.py @@ -84,6 +84,22 @@ class TaggerWindow( QtGui.QMainWindow): self.actionWrite_Tags.setStatusTip( 'Save tags to comic archive' ) self.actionWrite_Tags.triggered.connect( self.commitMetadata ) + self.actionRemoveCBLTags.setStatusTip( 'Remove ComicBookLover tags from comic archive' ) + self.actionRemoveCBLTags.triggered.connect( self.removeCBLTags ) + + self.actionRemoveCRTags.setStatusTip( 'Remove ComicRack tags from comic archive' ) + self.actionRemoveCRTags.triggered.connect( self.removeCRTags ) + + self.actionReloadAuto.setShortcut( 'Ctrl+R' ) + self.actionReloadAuto.setStatusTip( 'Reload selected style tags from archive' ) + self.actionReloadAuto.triggered.connect( self.reloadAuto ) + + self.actionReloadCBLTags.setStatusTip( 'Reload ComicBookLover tags' ) + self.actionReloadCBLTags.triggered.connect( self.reloadCBLTags ) + + self.actionReloadCRTags.setStatusTip( 'Reload ComicRack tags' ) + self.actionReloadCRTags.triggered.connect( self.reloadCRTags ) + #self.actionRepackage.setShortcut( ) self.actionRepackage.setStatusTip( 'Re-create archive as CBZ' ) self.actionRepackage.triggered.connect( self.repackageArchive ) @@ -97,7 +113,7 @@ class TaggerWindow( QtGui.QMainWindow): self.actionQuery_Online.setStatusTip( 'Search online for tags' ) self.actionQuery_Online.triggered.connect( self.queryOnline ) - self.actionClearEntryForm.setShortcut( 'Ctrl+C' ) + #self.actionClearEntryForm.setShortcut( 'Ctrl+C' ) self.actionClearEntryForm.setStatusTip( 'Clear all the data on the screen' ) self.actionClearEntryForm.triggered.connect( self.clearForm ) @@ -113,6 +129,8 @@ class TaggerWindow( QtGui.QMainWindow): self.toolBar.addAction( self.actionParse_Filename ) self.toolBar.addAction( self.actionQuery_Online ) self.toolBar.addAction( self.actionClearEntryForm ) + #self.toolBar.addAction( self.actionRemoveCBLTags ) + #self.toolBar.addAction( self.actionRemoveCRTags ) def repackageArchive( self ): QtGui.QMessageBox.information(self, self.tr("Repackage Comic Archive"), self.tr("TBD")) @@ -134,7 +152,7 @@ class TaggerWindow( QtGui.QMainWindow): #print self.droppedFile # displays the file name self.openArchive( str(self.droppedFile) ) - def openArchive( self, path ): + def openArchive( self, path, explicit_style=None, clear_form=True ): if path is None or path == "": return @@ -143,10 +161,46 @@ class TaggerWindow( QtGui.QMainWindow): if ca is not None and ca.seemsToBeAComicArchive(): + # clear form and current metadata, we're all in! + if clear_form: + self.clearForm() + self.comic_archive = ca + + if explicit_style is None: + hasCBI = ca.hasCBI() + hasCIX = ca.hasCIX() + hasNeither = not hasCIX and not hasCBI - self.metadata = self.comic_archive.readMetadata( self.data_style ) + # no style indicated, so try to choose + if hasNeither: + self.metadata = self.comic_archive.metadataFromFilename( ) + else: + if hasCBI and not hasCIX: + self.data_style = MetaDataStyle.CBI + elif hasCIX and not hasCBI: + self.data_style = MetaDataStyle.CIX + else: #both + reply = QtGui.QMessageBox.question(self, + self.tr("Multiple Tag Types!"), + self.tr("This archive has both ComicBookLover and ComicRack type tags. Which do you want to load?"), + self.tr("ComicBookLover"), self.tr("ComicRack" )) + if reply == 0: + # ComicBookLover + self.data_style = MetaDataStyle.CBI + else: + self.data_style = MetaDataStyle.CIX + self.adjustStyleCombo() + self.metadata = self.comic_archive.readMetadata( self.data_style ) + else: + if ca.hasMetadata( explicit_style ): + self.data_style = explicit_style + self.adjustStyleCombo() + self.metadata = self.comic_archive.readMetadata( self.data_style ) + else: + return + if self.metadata.isEmpty: self.metadata = self.comic_archive.metadataFromFilename( ) @@ -157,7 +211,6 @@ class TaggerWindow( QtGui.QMainWindow): self.lblCover.setPixmap(QtGui.QPixmap(img)) self.lblCover.setScaledContents(True) - #!!!ATB should I clear the form??? self.metadataToForm() self.updateAppTitle() self.updateInfoBox() @@ -179,6 +232,10 @@ class TaggerWindow( QtGui.QMainWindow): self.lblArchiveInfo.setText( info_text ) def clearForm( self ): + + # get a minty fresh metadata object + self.metadata = GenericMetadata() + # recursivly clear the tab form self.clearChildren( self.tabWidget ) @@ -369,18 +426,30 @@ class TaggerWindow( QtGui.QMainWindow): role = str(self.twCredits.item(row, 0).text()) name = str(self.twCredits.item(row, 1).text()) md.addCredit( name, role, False ) - print name, role, row row += 1 - + def useFilename( self ): self.metadata = self.comic_archive.metadataFromFilename( ) self.metadataToForm() def selectFile( self ): - path = str(QtGui.QFileDialog.getOpenFileName()) - self.openArchive( path ) + + dialog = QtGui.QFileDialog(self) + dialog.setFileMode(QtGui.QFileDialog.ExistingFile) + #dialog.setFileMode(QtGui.QFileDialog.Directory ) + filters = [ + "Comic archive files (*.cbz *.zip *.cbr *.rar)", + "Any files (*)" + ] + + dialog.setNameFilters(filters) + #dialog.setFilter (self, QString filter) + + if (dialog.exec_()): + fileList = dialog.selectedFiles() + self.openArchive( str(fileList[0]) ) def queryOnline(self): @@ -423,7 +492,6 @@ class TaggerWindow( QtGui.QMainWindow): def setDataStyle(self, s): self.data_style, b = self.cbDataStyle.itemData(s).toInt() self.updateStyleTweaks() - def updateStyleTweaks( self ): @@ -558,18 +626,22 @@ class TaggerWindow( QtGui.QMainWindow): screen = QtGui.QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2) + + def adjustStyleCombo( self ): + # select the current style + if ( self.data_style == MetaDataStyle.CBI ): + self.cbDataStyle.setCurrentIndex ( 0 ) + elif ( self.data_style == MetaDataStyle.CIX ): + self.cbDataStyle.setCurrentIndex ( 1 ) + self.updateStyleTweaks() + def populateComboBoxes( self ): # Add the entries to the tag style combobox self.cbDataStyle.addItem( "ComicBookLover", MetaDataStyle.CBI ) self.cbDataStyle.addItem( "ComicRack", MetaDataStyle.CIX ) - - # select the current style - if ( self.data_style == MetaDataStyle.CBI ): - self.cbDataStyle.setCurrentIndex ( 0 ) - elif ( self.data_style == MetaDataStyle.CIX ): - self.cbDataStyle.setCurrentIndex ( 1 ) + self.adjustStyleCombo() # Add the entries to the country combobox self.cbCountry.addItem( "", "" ) @@ -587,3 +659,37 @@ class TaggerWindow( QtGui.QMainWindow): self.cbManga.addItem( "Yes", "Yes" ) self.cbManga.addItem( "Yes (Right to Left)", "YesAndRightToLeft" ) self.cbManga.addItem( "No", "No" ) + + def removeCBLTags( self ): + self.removeTags( MetaDataStyle.CBI ) + + def removeCRTags( self ): + self.removeTags( MetaDataStyle.CIX ) + + def removeTags( self, style): + # remove the indicated tags from the archive + # ( keep the form and the current metadata object intact. ) + if self.comic_archive is not None and self.comic_archive.hasMetadata( style ): + reply = QtGui.QMessageBox.question(self, + self.tr("Remove Tags"), + self.tr("Are you sure you with to remove the " + MetaDataStyle.name[style] + " tags from this archive?"), + QtGui.QMessageBox.Yes, QtGui.QMessageBox.No ) + + if reply == QtGui.QMessageBox.Yes: + path = self.comic_archive.path + self.comic_archive.removeMetadata( style ) + self.updateInfoBox() + + + def reloadAuto( self ): + if self.comic_archive is not None and self.comic_archive.hasMetadata( self.data_style ): + self.openArchive( self.comic_archive.path, explicit_style=self.data_style ) + + def reloadCBLTags( self ): + if self.comic_archive is not None and self.comic_archive.hasCBI(): + self.openArchive( self.comic_archive.path, explicit_style=MetaDataStyle.CBI ) + + def reloadCRTags( self ): + if self.comic_archive is not None and self.comic_archive.hasCIX(): + self.openArchive( self.comic_archive.path, explicit_style=MetaDataStyle.CIX ) + diff --git a/taggerwindow.ui b/taggerwindow.ui index f8db6ad..b084f04 100644 --- a/taggerwindow.ui +++ b/taggerwindow.ui @@ -682,11 +682,26 @@ File + + + Remove + + + + + + + Reload + + + + + - - + + @@ -767,12 +782,27 @@ - Remove CR Tags + Remove ComicRack Tags - Remove CBL Tags + Remove ComicBookLover Tags + + + + + Reload ComicBookLover Tags + + + + + Reload ComicRack Tags + + + + + Reload Selected Tag Style diff --git a/todo.txt b/todo.txt index c72252c..f2aa6f0 100644 --- a/todo.txt +++ b/todo.txt @@ -1,4 +1,11 @@ -Remove metadata from archive + + +Need to keep a "dirty flag" for form + +Reload metadata from archive + - verification prompt is form is dirty + +Add License/Copyright headers ComicArchive support for folders ComicArchive support for reading RARs @@ -9,6 +16,8 @@ Toolbar icons Consolidate Credit Roles for english variants? : Penciler vs Penciller +Stand-alone CLI + TaggerWindow entry fields General layout Special Dialogs needed for: