Code Cleanup

This commit is contained in:
Nimesh Ghelani 2013-10-12 23:42:34 +05:30
parent 7d7f313034
commit 3813d17f9b
2 changed files with 36 additions and 10 deletions

View file

@ -8,22 +8,27 @@ Forked from the [shuffle-db-ng project](https://code.google.com/p/shuffle-db-ng/
Just put your audio files into the mass storage of your IPod and shuffle.py will do the rest Just put your audio files into the mass storage of your IPod and shuffle.py will do the rest
```bash ```bash
$ python shuffle.py -h $ python shuffle.py -h
usage: shuffle.py [-h] [--disable-voiceover] path usage: shuffle.py [-h] [--disable-voiceover] [--rename-unicode] path
positional arguments: positional arguments:
path path
optional arguments: optional arguments:
-h, --help show this help message and exit -h, --help show this help message and exit
--disable-voiceover --disable-voiceover Disable Voiceover Feature
--rename-unicode Rename Files Causing Unicode Errors, will do minimal
required renaming
``` ```
#### Additions to the original #### Additions to the original
* Option to disable voiceover * Option to disable voiceover
* Initialize the IPod Directory tree * Initialize the IPod Directory tree
* Instead of throwing an unicode error, renames the filename * Using the --rename-unicode flag, filenames with strange characters and different language are renamed which avoids the script to crash with a Unicode Error
##TODO ##TODO
* Last.fm Scrobbler * Last.fm Scrobbler
* Qt frontend * Qt frontend
* Simple Playlist Creation
##EXTRA READING
* [I wrote about how to use this script with Rhythmbox for easy syncing of playlists and songs](http://nims11.wordpress.com/2013/10/12/ipod-shuffle-4g-under-linux/)

View file

@ -27,6 +27,23 @@ def raises_unicode_error(str):
except UnicodeEncodeError, UnicodeDecodeError: except UnicodeEncodeError, UnicodeDecodeError:
return True return True
def hash_error_unicode(item):
return "".join(["{0:02X}".format(ord(x)) for x in reversed(hashlib.md5(item).digest()[:8])])
pass
def validate_unicode(path):
path_list = path.split('/')
last_raise = False
for i in xrange(len(path_list)):
if raises_unicode_error(path_list[i]):
path_list[i] = hash_error_unicode(path_list[i])
last_raise = True
else:
last_raise = False
extension = os.path.splitext(path)[1].lower()
return "/".join(path_list) + (extension if last_raise and extension in audio_ext else '')
class Record(object): class Record(object):
def __init__(self, parent): def __init__(self, parent):
@ -34,6 +51,7 @@ class Record(object):
self._struct = collections.OrderedDict([]) self._struct = collections.OrderedDict([])
self._fields = {} self._fields = {}
self.voiceover = parent.voiceover self.voiceover = parent.voiceover
self.rename = parent.rename
def __getitem__(self, item): def __getitem__(self, item):
if item not in self._struct.keys(): if item not in self._struct.keys():
@ -308,6 +326,8 @@ class Playlist(Record):
for i in data: for i in data:
if not i.startswith("#"): if not i.startswith("#"):
path = i.strip() path = i.strip()
if self.rename:
path = validate_unicode(path)
listtracks.append(path) listtracks.append(path)
return listtracks return listtracks
@ -320,6 +340,8 @@ class Playlist(Record):
filename = urllib.unquote(dataarr[1]).strip() filename = urllib.unquote(dataarr[1]).strip()
if filename.lower().startswith('file://'): if filename.lower().startswith('file://'):
filename = filename[7:] filename = filename[7:]
if self.rename:
filename = validate_unicode(filename)
sorttracks.append((num, filename)) sorttracks.append((num, filename))
listtracks = [ x for (_, x) in sorted(sorttracks) ] listtracks = [ x for (_, x) in sorted(sorttracks) ]
return listtracks return listtracks
@ -369,7 +391,7 @@ class Playlist(Record):
return output + chunks return output + chunks
class Shuffler(object): class Shuffler(object):
def __init__(self, path, voiceover=True): def __init__(self, path, voiceover=True, rename=False):
self.path, self.base = self.determine_base(path) self.path, self.base = self.determine_base(path)
self.tracks = [] self.tracks = []
self.albums = [] self.albums = []
@ -377,6 +399,7 @@ class Shuffler(object):
self.lists = [] self.lists = []
self.tunessd = None self.tunessd = None
self.voiceover = voiceover self.voiceover = voiceover
self.rename = rename
def initialize(self): def initialize(self):
for dirname in ('iPod_Control/iTunes', 'iPod_Control/Music', 'iPod_Control/Speakable/Playlists', 'iPod_Control/Speakable/Tracks'): for dirname in ('iPod_Control/iTunes', 'iPod_Control/Music', 'iPod_Control/Speakable/Playlists', 'iPod_Control/Speakable/Tracks'):
@ -422,22 +445,20 @@ class Shuffler(object):
def check_unicode(path): def check_unicode(path):
ret_flag = False # True if there is a recognizable file within this level ret_flag = False # True if there is a recognizable file within this level
print path
for item in os.listdir(path): for item in os.listdir(path):
if os.path.isfile(os.path.join(path, item)): if os.path.isfile(os.path.join(path, item)):
if os.path.splitext(item)[1].lower() in audio_ext+list_ext: if os.path.splitext(item)[1].lower() in audio_ext+list_ext:
ret_flag = True ret_flag = True
if raises_unicode_error(item): if raises_unicode_error(item):
src = os.path.join(path, item) src = os.path.join(path, item)
dest = os.path.join(path, dest = os.path.join(path, hash_error_unicode(item)) + os.path.splitext(item)[1].lower()
"".join(["{0:02X}".format(ord(x)) for x in reversed(hashlib.md5(item).digest()[:8])])) + os.path.splitext(item)[1].lower()
print 'Renaming %s -> %s' % (src, dest) print 'Renaming %s -> %s' % (src, dest)
os.rename(src, dest) os.rename(src, dest)
else: else:
ret_flag = (check_unicode(os.path.join(path, item)) or ret_flag) ret_flag = (check_unicode(os.path.join(path, item)) or ret_flag)
if ret_flag and raises_unicode_error(item): if ret_flag and raises_unicode_error(item):
src = os.path.join(path, item) src = os.path.join(path, item)
new_name = "".join(["{0:02X}".format(ord(x)) for x in reversed(hashlib.md5(item).digest()[:8])]) new_name = hash_error_unicode(item)
dest = os.path.join(path, new_name) dest = os.path.join(path, new_name)
print 'Renaming %s -> %s' % (src, dest) print 'Renaming %s -> %s' % (src, dest)
os.rename(src, dest) os.rename(src, dest)
@ -453,7 +474,7 @@ if __name__ == '__main__':
if result.rename_unicode: if result.rename_unicode:
check_unicode(result.path) check_unicode(result.path)
shuffle = Shuffler(result.path, voiceover=not result.disable_voiceover) shuffle = Shuffler(result.path, voiceover=not result.disable_voiceover, rename=result.rename_unicode)
shuffle.initialize() shuffle.initialize()
shuffle.populate() shuffle.populate()
shuffle.write_database() shuffle.write_database()