diff --git a/rebuild_db.py b/rebuild_db.py index 17f193e..ca0bc8f 100755 --- a/rebuild_db.py +++ b/rebuild_db.py @@ -13,10 +13,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -from builtins import input -from builtins import map -from builtins import range -from functools import reduce __title__ = "KeyJ's iPod shuffle Database Builder" __version__ = "1.0" @@ -67,6 +63,7 @@ __email__ = "martin.fiedler@gmx.net" """ import functools, sys, os, os.path, array, random, fnmatch, operator, string +from builtins import map, input, range from io import BytesIO from typing import TextIO @@ -149,14 +146,14 @@ def ParseRule(rule): sep_pos = min([rule.find(sep) for sep in "~=<>" if rule.find(sep) > 0]) prop = rule[:sep_pos].strip() if not prop in KnownProps: - log("WARNING: unknown property `%s'" % prop) + log(f"WARNING: unknown property '{prop}'") return prop, rule[sep_pos], ParseValue(rule[sep_pos + 1:].strip()) def ParseAction(action): prop, value = list(map(str.strip, action.split('=', 1))) if not prop in KnownProps: - log("WARNING: unknown property `%s'" % prop) + log(f"WARNING: unknown property '{prop}'") return prop, ParseValue(value) @@ -174,7 +171,7 @@ def ParseRuleLine(line): else: return list(map(ParseRule, ruleset)), actions except OSError: # (ValueError,IndexError,KeyError): - log("WARNING: rule `%s' is malformed, ignoring" % line) + log(f"WARNING: rule '{line}' is malformed, ignoring") return None @@ -191,14 +188,14 @@ def rename_safely(path, name): newname = ''.join(map(safe_char, base)) if name == newname + ext: return name - if os.path.exists("%s/%s%s" % (path, newname, ext)): + if os.path.exists(f"{path}/{newname}{ext}"): i = 0 - while os.path.exists("%s/%s_%d%s" % (path, newname, i, ext)): + while os.path.exists(f"{path}/{newname}_{i}{ext}"): i += 1 - newname += "_%d" % i + newname += f"_{i}" newname += ext try: - os.rename("%s/%s" % (path, name), "%s/%s" % (path, newname)) + os.rename(f"{path}/{name}", f"{path}/{newname}") except OSError: pass # don't fail if the rename didn't work return newname @@ -220,7 +217,7 @@ def write_to_db(filename): # check and apply rules for ruleset, action in Rules: - if reduce(operator.__and__, [MatchRule(props, rule) for rule in ruleset], True): + if functools.reduce(operator.__and__, [MatchRule(props, rule) for rule in ruleset], True): props.update(action) if props['ignore']: return 0 @@ -269,7 +266,7 @@ def cmp(a, b): def file_entry(path, name, prefix=""): if not name or name[0] == ".": return None - fullname = "%s/%s" % (path, name) + fullname = f"{path}/{name}" may_rename = not (fullname.startswith("./iPod_Control")) and args.rename try: if os.path.islink(fullname): @@ -293,7 +290,7 @@ def browse(path: string, interactive: bool): if not displaypath: displaypath = "/" while interactive: - choice = input("include `%s'? [(Y)es, (N)o, (A)ll] " % displaypath)[:1].lower() + choice = input(f"include '{displaypath}'? [(Y)es, (N)o, (A)ll] ")[:1].lower() if not choice: continue # all/alle/tous/ @@ -310,7 +307,7 @@ def browse(path: string, interactive: bool): subdirs = [x[2] for x in files if not x[0]] files = [x for x in files if x[0]] for dir in subdirs: - subpath = "%s/%s" % (path, dir) + subpath = f"{path}/{dir}" try: files.extend([x for x in [ file_entry(subpath, name, dir + "/") for name in os.listdir(subpath) @@ -323,13 +320,13 @@ def browse(path: string, interactive: bool): real_count = 0 for item in files: - fullname = "%s/%s" % (path, item[2]) + fullname = f"{path}/{item[2]}" if item[0]: real_count += write_to_db(fullname[1:]) else: browse(fullname, interactive) - log("%s: %d files (out of %d)" % (displaypath, real_count, count)) + log(f"{displaypath}: {real_count} files (out of {count})") ################################################################################ @@ -489,7 +486,7 @@ Please make sure that: if len(header) == 51: log("Using iTunesSD headers from existing database.") - if KnownEntries: log("Collected %d entries from existing database." % len(KnownEntries)) + if KnownEntries: log(f"Collected {len(KnownEntries)} entries from existing database.") else: del header[18:] if len(header) == 18: log("Using iTunesSD main header from existing database.") @@ -516,7 +513,7 @@ Please make sure that: try: for dir in dirs: browse("./" + dir, args.interactive) - log("%d playable files were found on your iPod." % total_count) + log(f"{total_count} playable files were found on your iPod.") log() log("Fixing iTunesSD header.") iTunesSD_file.seek(0)