diff --git a/iTunesParser.py b/iTunesParser.py index 85cc7e1..b5e0a98 100644 --- a/iTunesParser.py +++ b/iTunesParser.py @@ -45,6 +45,7 @@ import os import plistlib import sys import argparse +import hashlib class SetEncoder(json.JSONEncoder): @@ -135,8 +136,9 @@ class ITunesParser: akey = track['Artist'] # Add artist if akey not in self._artists: + a_id = self.calc_id(akey) self._artists[akey] = { - 'id': len(self._artists), # TODO Calc an uniq ID (permit to replace data) + 'Persistent ID': a_id, 'Name': akey, 'Track Count': 0, 'Play Count': 0, @@ -149,7 +151,7 @@ class ITunesParser: # TODO If no Rating, don't take 0 play_count = track['Play Count'] if 'Play Count' in track else 0 - rating = self._calc_rating(rating, self._artists[akey]['Rating'], self._artists[akey]['Track Count']) + rating = self.calc_rating(rating, self._artists[akey]['Rating'], self._artists[akey]['Track Count']) self._artists[akey]['Track Count'] += 1 self._artists[akey]['Rating'] = rating @@ -173,14 +175,15 @@ class ITunesParser: akey = track['Album'] if akey not in self._albums: + a_id = self.calc_id(akey) self._albums[akey] = { - 'id': len(self._albums), + 'Persistent ID': a_id, 'Name': akey, 'Track Count': 0, 'Play Count': 0, 'Rating': 0, 'Genre': set(), - 'artist': set() + 'Artist': set() } # Compute information @@ -189,7 +192,7 @@ class ITunesParser: # TODO If no Rating, don't take 0 play_count = track['Play Count'] if 'Play Count' in track else 0 - rating = self._calc_rating(rating, self._albums[akey]['Rating'], self._albums[akey]['Track Count']) + rating = self.calc_rating(rating, self._albums[akey]['Rating'], self._albums[akey]['Track Count']) self._albums[akey]['Track Count'] += 1 self._albums[akey]['Rating'] = rating @@ -205,7 +208,7 @@ class ITunesParser: ## Add different artists if 'Artist' not in track: return - self._albums[akey]['artist'].add(track['Artist']) + self._albums[akey]['Artist'].add(track['Artist']) return def _write_artists(self): @@ -215,8 +218,9 @@ class ITunesParser: file_artist = io.open('es-artist-data.json', 'wb') for artist in self._artists: + persistent_id = self._artists[artist]['Persistent ID'] json_track_index = { - "index": {"_index": "itunessongs", "_type": "artist"} + "index": {"_index": "itunessongs", "_type": "artist", "_id": persistent_id} } file_artist.write(bytes(json.dumps(json_track_index, indent=None, cls=SetEncoder), 'UTF-8')) file_artist.write(bytes("\n", 'UTF-8')) @@ -231,8 +235,9 @@ class ITunesParser: file_albums = io.open('es-albums-data.json', 'wb') for album in self._albums: + persistent_id = self._albums[album]['Persistent ID'] json_track_index = { - "index": {"_index": "itunessongs", "_type": "album"} + "index": {"_index": "itunessongs", "_type": "album", "_id": persistent_id} } file_albums.write(bytes(json.dumps(json_track_index, indent=None, cls=SetEncoder), 'UTF-8')) file_albums.write(bytes("\n", 'UTF-8')) @@ -240,9 +245,22 @@ class ITunesParser: file_albums.write(bytes("\n", 'UTF-8')) file_albums.close() - def _calc_rating(self, added_value, current_rating, count): + @classmethod + def calc_rating(cls, added_value, current_rating, count): + """ + Calculate average rating from a current rating, a rating value to add and the number of elements + """ return (current_rating * count + added_value) // (count + 1) + @classmethod + def calc_id(cls, key): + """ + Calculate a MD5 sum from a key as ID + """ + md5 = hashlib.md5() + md5.update(key.encode('UTF-8')) + return md5.hexdigest() + #### main block #### # Default input & output files