From bab75b6767bba68ac0b6c0d439548689ca6b53e2 Mon Sep 17 00:00:00 2001 From: eglwang Date: Sat, 18 Nov 2023 14:59:52 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=9F=B3=E4=B9=90?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=97=B6=E7=9A=84=E8=B7=AF=E5=BE=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF=EF=BC=9B=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=85=83=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cloudmusic/download.py | 24 ++++++--- cloudmusic/musicObj.py | 2 +- cloudmusic/setTags.py | 110 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 129 insertions(+), 7 deletions(-) create mode 100644 cloudmusic/setTags.py diff --git a/cloudmusic/download.py b/cloudmusic/download.py index 3f6893b..3a34b92 100644 --- a/cloudmusic/download.py +++ b/cloudmusic/download.py @@ -1,10 +1,10 @@ from . import musicObj - +from . import setTags import urllib import os import threadpool import time - +import re def download(dirs, music): @@ -15,15 +15,16 @@ def download(dirs, music): for ar in music.artist: artist += ar + " " name = music.name + " - " + artist + "." + music.type + name = re.sub(r'[\\/*?:"<>|]', " ", name) if not dirs: - dirs = "cloudmusic\\" + name - defalut_dirs = str(os.getcwd()) + '\\cloudmusic' + dirs = os.path.join('cloudmusic', 'name') + defalut_dirs = os.path.join(os.getcwd() , 'cloudmusic') isExist = os.path.exists(defalut_dirs) if not isExist: os.makedirs(defalut_dirs) else : - dirs += "\\" + name + dirs = os.path.join(dirs, name) # 超时重连 for t in range(5): @@ -43,9 +44,20 @@ def download(dirs, music): binfile.write(respHtml) binfile.close() + try: + if music.type == "mp3": + setTags.set_tags_for_mp3(dirs, music.picUrl, artist, music.album, music.name) + elif music.type == 'm4a': + setTags.set_tags_for_m4a(dirs, music.picUrl, artist, music.album, music.name) + elif music.type == 'flac': + setTags.set_tags_for_flac(dirs, music.picUrl, artist, music.album, music.name) + except Exception as e: + print("set tags failed - " + music.id) + print("Error: " + str(e)) + print("dowload finish - " + music.id) - return str(os.getcwd()) + dirs + return os.path.join(os.getcwd(), dirs) class Downloader(): diff --git a/cloudmusic/musicObj.py b/cloudmusic/musicObj.py index 65d0c10..a7d4e36 100644 --- a/cloudmusic/musicObj.py +++ b/cloudmusic/musicObj.py @@ -75,7 +75,7 @@ def download(self, dirs="", level="standard"): if level == "standard": return download.download(dirs, self) elif level in self.levels: - return createObj([self.id], level).download() + return createObj([self.id], level).download(dirs) else: print("没有这个level, 默认standard") return download.download(dirs, self) diff --git a/cloudmusic/setTags.py b/cloudmusic/setTags.py new file mode 100644 index 0000000..ced0845 --- /dev/null +++ b/cloudmusic/setTags.py @@ -0,0 +1,110 @@ +try: + import mutagen + mutagen_available = True +except: + mutagen_available = False + +try: + from PIL import Image + pil_available = True +except: + pil_available = False + +import urllib +import io + +def resize_the_cover_picture(pic_url): + data = urllib.request.urlopen(pic_url).read() + if not pil_available: + return data + if len(data)>3e6: + img = Image.open(io.BytesIO(data)) + img = img.convert("RGB") + img = img.resize((500, 500), Image.ANTIALIAS) + byte_arr = io.BytesIO() + img.save(byte_arr, format='JPEG', quality=95) + return byte_arr.getvalue() + else: + return data + + +def set_tags_for_mp3(mp_path,pic_url='',artist='',album='',music_name=''): + if not mutagen_available: + print("mutagen not available, won't set tags") + return + + audio = mutagen.File(mp_path) + if pic_url: + audio.tags.add( + mutagen.id3.APIC( + encoding=3, + mime='image/jpeg', + type=3, + desc=u'Cover', + data=resize_the_cover_picture(pic_url) + ) + ) + if artist: + audio.tags.add( + mutagen.id3.TPE1( + encoding=3, + text=artist + ) + ) + if album: + audio.tags.add( + mutagen.id3.TALB( + encoding=3, + text=album + ) + ) + if music_name: + audio.tags.add( + mutagen.id3.TIT2( + encoding=3, + text=music_name + ) + ) + audio.save() + + +def set_tags_for_m4a(mp_path,pic_url='',artist='',album='',music_name=''): + if not mutagen_available: + print("mutagen not available, won't set tags") + return + + audio = mutagen.File(mp_path) + if pic_url: + audio.tags['covr'] = [ + mutagen.mp4.MP4Cover( + resize_the_cover_picture(pic_url), + imageformat=mutagen.mp4.MP4Cover.FORMAT_JPEG + ) + ] + if artist: + audio.tags['\xa9ART'] = artist + if album: + audio.tags['\xa9alb'] = album + if music_name: + audio.tags['\xa9nam'] = music_name + audio.save() + +def set_tags_for_flac(mp_path,pic_url='',artist='',album='',music_name=''): + if not mutagen_available: + print("mutagen not available, won't set tags") + return + + audio = mutagen.File(mp_path) + if pic_url: + pic = mutagen.flac.Picture() + pic.type = 3 + pic.mime = 'image/jpeg' + pic.data = resize_the_cover_picture(pic_url) + audio.add_picture(pic) + if artist: + audio.tags['artist'] = artist + if album: + audio.tags['album'] = album + if music_name: + audio.tags['title'] = music_name + audio.save() From aba733d83bd2b720be3bbb9407b69cb53e3358b2 Mon Sep 17 00:00:00 2001 From: eglwang Date: Sat, 18 Nov 2023 15:19:05 +0800 Subject: [PATCH 2/2] an small bug --- cloudmusic/download.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cloudmusic/download.py b/cloudmusic/download.py index 3a34b92..ece0f37 100644 --- a/cloudmusic/download.py +++ b/cloudmusic/download.py @@ -18,7 +18,7 @@ def download(dirs, music): name = re.sub(r'[\\/*?:"<>|]', " ", name) if not dirs: - dirs = os.path.join('cloudmusic', 'name') + dirs = os.path.join('cloudmusic', name) defalut_dirs = os.path.join(os.getcwd() , 'cloudmusic') isExist = os.path.exists(defalut_dirs) if not isExist: @@ -54,7 +54,7 @@ def download(dirs, music): except Exception as e: print("set tags failed - " + music.id) print("Error: " + str(e)) - + print("dowload finish - " + music.id) return os.path.join(os.getcwd(), dirs)