def scanSingleDir(self, dirPath): print("Dir", dirPath) items = os.listdir(dirPath) items.sort() for item in items: item = os.path.join(dirPath, item) if os.path.isfile(item): fPath, fName = os.path.split(item) guessName = nt.guessSeriesFromFilename(fName) dirName = fPath.strip("/").split("/")[-1] guess2 = nt.guessSeriesFromFilename(dirName) if guessName != guess2: print("Dirname not matching either?", dirName, guessName) if guessName in nt.dirNameProxy: itemInfo = nt.dirNameProxy[guessName] if itemInfo["fqPath"] != dirPath: dstDir = nt.dirNameProxy[guessName]["fqPath"] print("Move file '%s' from:" % fName) print(" Src = '%s'" % fPath) print(" Dst = '%s'" % dstDir) doMove = query_response_bool("Do move?") if doMove: shutil.move(item, os.path.join(dstDir, fName))
def renameSeriesToMatchMangaUpdates(scanpath): idLut = nt.MtNamesMapWrapper("fsName->buId") muLut = nt.MtNamesMapWrapper("buId->buName") db = DbInterface() print("Scanning") foundDirs = 0 contents = os.listdir(scanpath) for dirName in contents: cName = nt.prepFilenameForMatching(dirName) mtId = idLut[cName] if mtId and len(mtId) > 1: print("Multiple mtId values for '%s' ('%s')" % (cName, dirName)) print(" ", mtId) print(" Skipping item") elif mtId: mtId = mtId.pop() mtName = muLut[mtId].pop() cMtName = nt.prepFilenameForMatching(mtName) if cMtName != cName: print("Dir '%s' ('%s')" % (cName, dirName)) print(" Should be '%s'" % (mtName, )) print(" URL: https://www.mangaupdates.com/series.html?id=%s" % (mtId, )) oldPath = os.path.join(scanpath, dirName) newPath = os.path.join(scanpath, nt.makeFilenameSafe(mtName)) if not os.path.isdir(oldPath): raise ValueError("Not a dir. Wat?") print(" old '%s'" % (oldPath, )) print(" new '%s'" % (newPath, )) newCl = nt.cleanUnicode(newPath) if newCl != newPath: print("Unicode oddness. Skipping") continue rating = nt.extractRatingToFloat(oldPath) if rating != 0: print(" Need to add rating = ", rating) mv = query_response_bool(" rename?") if mv: # if os.path.exists(newPath): print("Target dir exists! Moving files instead") moveFiles(oldPath, newPath) os.rmdir(oldPath) nt.dirNameProxy.changeRatingPath(newPath, rating) else: os.rename(oldPath, newPath) nt.dirNameProxy.changeRatingPath(newPath, rating) foundDirs += 1 print("Total directories that need renaming", foundDirs)
def aggregateDirs(self, pathBase_1, pathBase_2, dir1, dir2): canonName = nt.getCanonicalMangaUpdatesName(dir1) canonNameAlt = nt.getCanonicalMangaUpdatesName(dir2) cname1 = nt.prepFilenameForMatching(canonName) cname2 = nt.prepFilenameForMatching(canonNameAlt) if canonName.lower() != canonNameAlt.lower(): self.log.critical("Error in uploading file. Name lookup via MangaUpdates table not commutative!") self.log.critical("First returned value '%s'", canonName) self.log.critical("For directory with path '%s'", dir1) self.log.critical("Second returned value '%s'", canonNameAlt) self.log.critical("For directory with path '%s'", dir2) self.log.critical("After cleaning: '%s', '%s', equal: '%s'", cname1, cname2, cname1 == cname2) raise CanonMismatch("Identical and yet not? '%s' - '%s'" % (canonName, canonNameAlt)) self.log.info("Aggregating directories for canon name '%s':", canonName) n1 = lv.distance(dir1, canonName) n2 = lv.distance(dir2, canonName) self.log.info(" %s - '%s' https://manga.madokami.al/%s/", n1, dir1, pathBase_1) self.log.info(" %s - '%s' https://manga.madokami.al/%s/", n2, dir2, pathBase_2) # I'm using less then or equal, so situations where # both names are equadistant get aggregated anyways. if n1 <= n2: src = os.path.join(pathBase_2, dir2) dst = os.path.join(pathBase_1, dir1) else: src = os.path.join(pathBase_1, dir1) dst = os.path.join(pathBase_2, dir2) doMove = query_response_bool("Do move?") if doMove: self.moveItemsInDir(src, dst) self.log.info("Removing directory '%s'", src) try: self.sftp.mkdir("/Admin cleanup/autoclean dirs") except: pass self.sftp.rename(src, "/Admin cleanup/autoclean dirs/garbage dir %s" % src.replace("/", ";").replace(" ", "_")) return dst