From dcdcb712e45ce8b89985d8a50a21e9a5e61492ef Mon Sep 17 00:00:00 2001 From: hennadii-demchenko Date: Sat, 1 Apr 2023 21:33:50 +0300 Subject: [PATCH] Implement fetching metadata from mp3 files --- cps/mp3.py | 32 ++++++++++++++++++++++++++++++++ cps/uploader.py | 13 +++++++++++-- optional-requirements.txt | 1 + 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 cps/mp3.py diff --git a/cps/mp3.py b/cps/mp3.py new file mode 100644 index 00000000..6c41d702 --- /dev/null +++ b/cps/mp3.py @@ -0,0 +1,32 @@ +from eyed3.core import Date +from eyed3.id3 import Tag + +from cps.constants import BookMeta +import eyed3 + + +def get_mp3_file_info( + tmp_file_path: str, original_file_extension: str, original_file_name: str +) -> BookMeta: + mp3 = eyed3.load(tmp_file_path) + mp3_tags: Tag = mp3.tag if mp3 is not None else Tag() + release_date = mp3_tags.release_date + pubdate = "-".join([ + release_date.year, release_date.month, release_date.day + ]) if isinstance(release_date, Date) else "" + + return BookMeta( + file_path=tmp_file_path, + extension=original_file_extension, + title=mp3_tags.title or original_file_name, + author=mp3_tags.artist or mp3_tags.album_artist or "Unknown", + cover=None, + description="", + tags="", + series=mp3_tags.album or "", + series_id="", + languages="", + publisher=mp3_tags.publisher or "", + pubdate=pubdate, + identifiers=[], + ) diff --git a/cps/uploader.py b/cps/uploader.py index 3cd7b21a..bcf77c1c 100644 --- a/cps/uploader.py +++ b/cps/uploader.py @@ -68,6 +68,13 @@ except ImportError as e: log.debug('Cannot import fb2, extracting fb2 metadata will not work: %s', e) use_fb2_meta = False +try: + from . import mp3 + use_mp3_meta = True +except ImportError as e: + log.debug('Cannot import mp3, extracting mp3 metadata will not work: %s', e) + use_mp3_meta = False + def process(tmp_file_path, original_file_name, original_file_extension, rarExecutable): meta = default_meta(tmp_file_path, original_file_name, original_file_extension) @@ -75,15 +82,17 @@ def process(tmp_file_path, original_file_name, original_file_extension, rarExecu try: if ".PDF" == extension_upper: meta = pdf_meta(tmp_file_path, original_file_name, original_file_extension) - elif extension_upper in [".KEPUB", ".EPUB"] and use_epub_meta is True: + elif extension_upper in [".KEPUB", ".EPUB"] and use_epub_meta: meta = epub.get_epub_info(tmp_file_path, original_file_name, original_file_extension) - elif ".FB2" == extension_upper and use_fb2_meta is True: + elif ".FB2" == extension_upper and use_fb2_meta: meta = fb2.get_fb2_info(tmp_file_path, original_file_extension) elif extension_upper in ['.CBZ', '.CBT', '.CBR']: meta = comic.get_comic_info(tmp_file_path, original_file_name, original_file_extension, rarExecutable) + elif extension_upper == ".MP3" and use_mp3_meta: + meta = mp3.get_mp3_file_info(tmp_file_path, original_file_extension, original_file_name) except Exception as ex: log.warning('cannot parse metadata, using default: %s', ex) diff --git a/optional-requirements.txt b/optional-requirements.txt index ad2b56c0..29bc2686 100644 --- a/optional-requirements.txt +++ b/optional-requirements.txt @@ -35,6 +35,7 @@ html2text>=2020.1.16,<2022.1.1 python-dateutil>=2.1,<2.9.0 beautifulsoup4>=4.0.1,<4.12.0 faust-cchardet>=2.1.18 +eyed3>=0.9.7 # Comics natsort>=2.2.0,<8.4.0