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...
-----------------------------------------------------------------------------------
"""



[Home page] Books Code Blog Python Author Train Find ©M.Lutz