summaryrefslogtreecommitdiff
path: root/tidal_dl_ng/metadata.py
diff options
context:
space:
mode:
authorRobert Honz <exislow+github@gmail.com>2023-12-19 23:58:57 +0100
committerRobert Honz <exislow+github@gmail.com>2023-12-19 23:58:57 +0100
commit0d4a9d6b8740035346d098f5bc28ebca64f6cd4d (patch)
treef52c9569509565e581b03b6e60fe32e611b79ad2 /tidal_dl_ng/metadata.py
parent82a8fe96aa08903919a90a76030bacba9f93b8e0 (diff)
downloadtidal-dl-ng-0d4a9d6b8740035346d098f5bc28ebca64f6cd4d.tar.gz
🌟 Re-add all project files.
Diffstat (limited to 'tidal_dl_ng/metadata.py')
-rw-r--r--tidal_dl_ng/metadata.py163
1 files changed, 163 insertions, 0 deletions
diff --git a/tidal_dl_ng/metadata.py b/tidal_dl_ng/metadata.py
new file mode 100644
index 0000000..1b53dea
--- /dev/null
+++ b/tidal_dl_ng/metadata.py
@@ -0,0 +1,163 @@
+import pathlib
+
+import mutagen
+import requests
+from mutagen import flac, mp4
+from mutagen.id3 import APIC, TALB, TCOM, TCOP, TDRC, TIT2, TOPE, TPE1, TRCK, TSRC, USLT
+
+
+class Metadata:
+ path_file: str = None
+ type_audio: str = None
+ title: str = None
+ album: str = None
+ albumartist: str = None
+ artists: [str] = None
+ copy_right: str = None
+ tracknumber: int = None
+ discnumber: int = None
+ totaldisc: int = None
+ totaltrack: int = None
+ date: str = None
+ composer: [str] = None
+ isrc: str = None
+ lyrics: str = None
+ path_cover: str = None
+ url_cover: str = None
+ m: mutagen.mp4.MP4 | mutagen.mp4.MP4 | mutagen.flac.FLAC = None
+
+ # TODO: What about videos?
+ def __init__(
+ self,
+ path_file: str,
+ type_audio: str = "",
+ album: str = "",
+ title: str = "",
+ artists: [str] = [""],
+ copy_right: str = "",
+ tracknumber: int = 0,
+ discnumber: int = 0,
+ totaltrack: int = 0,
+ totaldisc: int = 0,
+ composer: [str] = [""],
+ isrc: str = "",
+ albumartist: str = "",
+ date: str = "",
+ lyrics: str = "",
+ path_cover: str = "",
+ url_cover: str = "",
+ ):
+ self.path_file = path_file
+
+ if type_audio:
+ self.type_audio = type_audio
+ else:
+ self.type_audio = pathlib.Path(self.path_file).suffix[1:]
+
+ self.title = title
+ self.album = album
+ self.albumartist = albumartist
+ self.artists = artists
+ self.copy_right = copy_right
+ self.tracknumber = tracknumber
+ self.discnumber = discnumber
+ self.totaldisc = totaldisc
+ self.totaltrack = totaltrack
+ self.date = date
+ self.composer = composer
+ self.isrc = isrc
+ self.lyrics = lyrics
+ self.path_cover = path_cover
+ self.url_cover = url_cover
+ self.m: mutagen.MP4.MP4 | mutagen.m4a.M4A | mutagen.flac.FLAC | mutagen.mp3.MP3 = mutagen.File(self.path_file)
+
+ def _cover(self) -> bool:
+ result = False
+ data_cover = None
+
+ if self.url_cover:
+ try:
+ data_cover = requests.get(self.url_cover).content
+ except:
+ data_cover = ""
+ elif self.path_cover:
+ with open(self.path_cover, "rb") as f:
+ data_cover = f.read()
+
+ if data_cover:
+ if self.type_audio == "flac":
+ flac_cover = flac.Picture()
+ flac_cover.data = data_cover
+ flac_cover.mime = "image/jpeg"
+
+ self.m.clear_pictures()
+ self.m.add_picture(flac_cover)
+ elif self.type_audio == "mp3":
+ self.m.tags.add(APIC(encoding=3, data=data_cover))
+ elif self.type_audio in ["mp4", "m4a"]:
+ cover_mp4 = mp4.MP4Cover(data_cover)
+ self.m.tags["covr"] = [cover_mp4]
+
+ result = True
+
+ return result
+
+ def save(self):
+ if self.type_audio == "flac":
+ self.set_flac()
+ elif self.type_audio in ["mp3", "ts"]:
+ self.set_mp3()
+ elif self.type_audio in ["mp4", "m4a"]:
+ self.set_mp4()
+
+ self._cover()
+ self.m.save()
+
+ return True
+
+ def set_flac(self):
+ if not self.m.tags:
+ self.m.add_tags()
+
+ self.m.tags["title"] = self.title
+ self.m.tags["album"] = self.album
+ self.m.tags["albumartist"] = self.albumartist
+ self.m.tags["artist"] = ", ".join(self.artists)
+ self.m.tags["copyright"] = self.copy_right
+ self.m.tags["tracknumber"] = str(self.tracknumber)
+ self.m.tags["tracktotal"] = str(self.totaltrack)
+ self.m.tags["discnumber"] = str(self.discnumber)
+ self.m.tags["disctotal"] = str(self.totaldisc)
+ self.m.tags["date"] = self.date
+ self.m.tags["composer"] = ", ".join(self.composer)
+ self.m.tags["isrc"] = self.isrc
+ self.m.tags["lyrics"] = self.lyrics
+
+ def set_mp3(self):
+ if not self.m.tags:
+ self.m.add_tags()
+
+ self.m.tags.add(TIT2(encoding=3, text=self.title))
+ self.m.tags.add(TALB(encoding=3, text=self.album))
+ self.m.tags.add(TOPE(encoding=3, text=self.albumartist))
+ self.m.tags.add(TPE1(encoding=3, text=", ".join(self.artists)))
+ self.m.tags.add(TCOP(encoding=3, text=self.copy_right))
+ self.m.tags.add(TRCK(encoding=3, text=str(self.tracknumber)))
+ self.m.tags.add(TRCK(encoding=3, text=self.discnumber))
+ self.m.tags.add(TDRC(encoding=3, text=self.date))
+ self.m.tags.add(TCOM(encoding=3, text=", ".join(self.composer)))
+ self.m.tags.add(TSRC(encoding=3, text=self.isrc))
+ self.m.tags.add(USLT(encoding=3, lang="eng", desc="desc", text=self.lyrics))
+
+ def set_mp4(self):
+ self.m.tags["\xa9nam"] = self.title
+ self.m.tags["\xa9alb"] = self.album
+ self.m.tags["aART"] = self.albumartist
+ self.m.tags["\xa9ART"] = ", ".join(self.artists)
+ self.m.tags["cprt"] = self.copy_right
+ self.m.tags["trkn"] = [[self.tracknumber, self.totaltrack]]
+ self.m.tags["disk"] = [[self.discnumber, self.totaldisc]]
+ # self.m.tags['\xa9gen'] = self.genre
+ self.m.tags["\xa9day"] = self.date
+ self.m.tags["\xa9wrt"] = ", ".join(self.composer)
+ self.m.tags["\xa9lyr"] = self.lyrics