File: rename-itunes.py
#!/usr/bin/env python3
"""
======================================================================
rename-itunes.py - strip track numbers in all filenames in a folder.
License: provided freely, but with no warranties of any kind.
Author/copyright: 2011-2018, M. Lutz (http://learning-python.com).
Versions:
2.0, Jul-2018
Check for same content on duplicates-post-rename,
and delete redundant copies automatically.
1.1, May-2018
Polish slightly: '.*' skips, verify=False option.
1.0. 2011
Original version (named "renamer.py" till renamed...).
Renames all music files in a single folder, dropping any numeric
digits at the front of their filenames to discard track/disc numbers
(e.g., "02 xxx.mp3", "02 - xxx.mp3", and "3-02 xxx.mp3"). These
prefixes make it difficult to detect duplicates by sorts, etc.
Typically run against the Flattened/Playable folder produced by
running flatten-itunes-2.py to normalize an entire music-file tree.
May also be run against a files folder created by manually merging
other folders via drag-and-drop or other. Python 3.X-only: input().
CAUTION: use this script with care - it changes filenames in-place,
with no provision for undoing its changes. Also note that its
"verify" switch now False by default, so any non-alpha prefixes in
filenames will be silently stripped, even prefixes that are not
real track numbers (e.g., "2112 Overture.mp3", "90 degrees.mp3",
"(What's...).mp3"). Set verify=True to be asked about each rename,
and review its results in the results file and subject folder.
======================================================================
"""
import os, string, sys
verify = False # True=ask about every change (see caution above)
cwd = input('Folder to scan? ') # this dir only (not subdirs)
if not os.path.isdir(cwd):
print('Invalid folder name: exiting.')
sys.exit(1)
if not input('Will rename files in-place - proceed? ').startswith(('y', 'Y')):
print('Run cancelled, no changes made.')
sys.exit(1)
sys.stdout = open('Rename-results.txt', 'w') # send prints here (tbd: encoding)
os.chdir(cwd) # cd to folder - all files in '.'
numfiles = numrename = numdupskip = numdupkeep = 0
for name in os.listdir('.'): # scan preexisting filenames
numfiles += 1
if not os.path.isfile(name) or name[0] == '.': # skip subdirs, ".*" hiddens
continue
if name[0] in string.ascii_letters: # skip if alpha start already
continue
if verify and input('Rename? "%s" ' % name).lower() != 'y':
print('skipped')
continue
rename = name
while rename and rename[0] not in string.ascii_letters: # scan to first alpha
rename = rename[1:]
if not rename:
rename = name # all nonalpha
altname = verify and input('new name? ["%s"] ' % rename) # Enter=[suggestion]
if altname:
rename = altname
if os.path.exists(rename):
print('Target filename already exists: "%s" -> "%s"' % (name, rename))
if open(name, 'rb').read() == open(rename, 'rb').read():
numdupskip += 1
print('\tFiles have same content - discarded redundant copy: "%s"' % name)
os.remove(name)
else:
numdupkeep += 1
print('\t***CONTENT DIFFERS - retained both original files')
print('\tFile sizes:', os.path.getsize(name), os.path.getsize(rename))
else:
numrename += 1
os.rename(name, rename)
print('Renamed: "%s" -> "%s"' % (name, rename))
print('\nSummary: files=%d, renames=%d, dupskips=%d, dupkeeps=%d.' %
(numfiles, numrename, numdupskip, numdupkeep))
sys.stderr.write('See results in file: %s\n' % 'Rename-results.txt')
"""
===================================================================================
EXAMPLE USAGE (see also flatten-itunes-2.py):
E:\Music\resolve-itunes-nov11> rename-itunes.py
Folder to scan? C:\MusicMergeNov11\Flattened\Playable
Rename? "(What's So Funny 'Bout) Peace, Love.mp3"
skipped
Rename? "01 - Four Wheel Drive.mp3" y
new name? ["Four Wheel Drive.mp3"]
renamed: "01 - Four Wheel Drive.mp3" -> "Four Wheel Drive.mp3"
Rename? "01 - She Drives Me Crazy.mp3" y
new name? ["She Drives Me Crazy.mp3"] Hmmm.mp3
renamed: "01 - She Drives Me Crazy.mp3" -> "Hmmm.mp3"
Rename? "01 Always Look On the Bright Side of.m4a"
skipped
...etc...
-----------------------------------------------------------------------------------
With verify=False (and on Mac OS):
/MY-STUFF/Code$ ./rename-itunes.py
Folder to scan? /Users/mini/Desktop/test/Flattened/Playable
renamed: "06 - State Of The Ark.mp3" -> "State Of The Ark.mp3"
renamed: "04 - The Lady in My Life.mp3" -> "The Lady in My Life.mp3"
...etc...
-----------------------------------------------------------------------------------
"""