From 95a6d0d6a1b6996bd249f4c7f396f1915975fa66 Mon Sep 17 00:00:00 2001 From: "Maxence G. de Montauzan" Date: Wed, 22 Oct 2025 17:02:58 +0200 Subject: [PATCH] improve write file + restore ELS format --- iTunesParser.py | 77 +++++++++++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/iTunesParser.py b/iTunesParser.py index 8b2589a..9b10b52 100644 --- a/iTunesParser.py +++ b/iTunesParser.py @@ -51,7 +51,7 @@ import os import plistlib -class SetEncoder(json.JSONEncoder): +class JsonCustomEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, set): return list(obj) @@ -66,11 +66,6 @@ class ITunesParser: Parse an iTunes Library and produce JSON - for ELS """ - SONG_INDEX = "itunes-songs" - ALBUM_INDEX = "itunes-albums" - ARTIST_INDEX = "itunes-artists" - # TODO Put variables in a config files or in a python library - def __init__(self): self._tracks = {} self._albums = {} @@ -94,7 +89,7 @@ class ITunesParser: plist = plistlib.load(open(library_file, "rb")) return plist["Tracks"] - def parse(self, library_file): + def parse(self, library_file) -> dict: """ Return an output JSON for an ELS Bulk request - Not a correct format This method call process_album & process_artist @@ -262,41 +257,44 @@ class ITunesParser: class WriteElsJson: @staticmethod def write_elements( - elements: dict, - o_name: str, + elements: list, + element_type: str, json_style: str, - els_index=ITunesParser.SONG_INDEX, - els=False, ): """ Write songs to a JSON """ - output_filename = f"{o_name}.{json_style}" + output_filename = f"es-{element_type}.{json_style}" + if json_style == "els": + output_filename += ".json" - with io.open(output_filename, "wb") as ofile: - if json_style == "json": - ofile.write(bytes("[\n", "UTF-8")) - for persistent_id, song in elements.items(): - if els: - json_track_index = { - "index": { - "_index": els_index, - "_id": persistent_id, - } - } - # file.write(bytes(json.dumps(json_track_index, indent=None, cls=SetEncoder), 'UTF-8')) - # file.write(bytes("\n", 'UTF-8')) + json_dump_option = {"ensure_ascii": False, "cls": JsonCustomEncoder} - ofile.write( - bytes(json.dumps(song, indent=None, cls=SetEncoder), "UTF-8") - ) - if json_style == "json": + with open(output_filename, "w", encoding="utf-8") as ofile: + match json_style: + case "json": + json_str = json.dumps(elements, **json_dump_option) ofile.write( - bytes(",", "UTF-8") - ) # TODO Doesn't work -> last line... - ofile.write(bytes("\n", "UTF-8")) - if json_style == "json": - ofile.write(bytes("]\n", "UTF-8")) + json_str.replace("}, {", "},\n{") + ) # One line = one record + case "jsonl": + for el in elements: + json.dump(el, ofile, **json_dump_option) + ofile.write("\n") + case "els": + for el in elements: + json_track_index = { + "index": { + "_index": f"itunes-{element_type}", + "_id": el["Persistent ID"], + } + } + json.dump(json_track_index, ofile, **json_dump_option) + ofile.write("\n") + json.dump(el, ofile, **json_dump_option) + ofile.write("\n") + case _: + print("ERROR: no write format") #### main block #### @@ -333,7 +331,7 @@ parser.add_argument( parser.add_argument( "-F", "--format", - choices=["json", "jsonl"], + choices=["json", "jsonl", "els"], default="json", help="Choose JSON style", ) @@ -347,12 +345,15 @@ if __name__ == "__main__": itunes_parser = ITunesParser().parse(args.file) print("Writing JSON files...") - WriteElsJson.write_elements(itunes_parser["songs"], "es-songs", args.format) + WriteElsJson.write_elements( - itunes_parser["artists"], "es-artists", args.format, ITunesParser.ARTIST_INDEX + [x for _, x in itunes_parser["songs"].items()], "songs", args.format ) WriteElsJson.write_elements( - itunes_parser["albums"], "es-albums", args.format, ITunesParser.ARTIST_INDEX + [x for _, x in itunes_parser["artists"].items()], "artists", args.format + ) + WriteElsJson.write_elements( + [x for _, x in itunes_parser["albums"].items()], "albums", args.format ) print("Done!")