From daf085a0942dd2ec8e43f026411f81d7356f9794 Mon Sep 17 00:00:00 2001 From: cyliuu Date: Fri, 4 Aug 2023 15:15:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BD=91=E6=98=93=E4=BA=91?= =?UTF-8?q?=E4=BA=91=E7=9B=98=E5=8A=9F=E8=83=BD=20(#36)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 修复云盘上传逻辑 2. 更精准地判断云盘歌曲是否存在于网易云音乐库中 --- fuo_netease/models.py | 36 +++++++++++++----------------------- fuo_netease/page_fav.py | 4 ++-- 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/fuo_netease/models.py b/fuo_netease/models.py index c333b54..b25dc8a 100644 --- a/fuo_netease/models.py +++ b/fuo_netease/models.py @@ -1,6 +1,5 @@ import logging -from marshmallow.exceptions import ValidationError from feeluown.utils.reader import RandomSequentialReader from .excs import NeteaseIOError @@ -34,7 +33,7 @@ def read_func(start, end): return reader -def create_cloud_songs_g(func, func_extra, schema=None, schema_extra=None, +def create_cloud_songs_g(func, func_private, schema=None, schema_private=None, data_field=None, data_key=None): data = func(limit=0) if data is None: @@ -48,35 +47,26 @@ def read_func(start, end): songs_data = func(start, end - start) songs = [] - extra_songs_info = [] + private_songs_info = [] for idx, song_data in enumerate(songs_data[data_field]): if data_key: song_data = song_data[data_key] - try: - song = _deserialize(song_data, schema) - except ValidationError: + if song_data['id'] == song_data['s_id']: # FIXME: 有些云盘歌曲在 netease 上不存在,这时不能把它们转换成 # SongModel。因为 SongModel 的逻辑没有考虑 song 不存在的情况。 - # 这类歌曲往往没有 ar/al 等字段,在反序列化的时候会报 ValidationError, - # 所以这里如果检测到 ValidationError,就跳过这首歌曲。 - # - # 可能的修复方法: - # 1. 在 SongModel 上加一个 flag 来标识该歌曲是否为云盘歌曲, - # 如果是的话,则使用 cloud_song_detail 接口来获取相关信息。 - # name = song_data['name'] - # logger.warn(f'cloud song:{name} may not exist on netease, skip it.') - extra_songs_info.append((idx, song_data['id'])) - # song_data = func_extra(str(song_data['id']))[data_field][0] - # song = _deserialize(song_data, schema_extra) + name = song_data['name'] + logger.warning(f'cloud song:{name} may not exist on netease.') + private_songs_info.append((idx, song_data['id'])) else: + song = _deserialize(song_data, schema) songs.append(song) - if extra_songs_info: - extra_song_ids = ','.join([str(id) for (_, id) in extra_songs_info]) - extra_songs_data = func_extra(extra_song_ids) - for idx, song_data in enumerate(extra_songs_data[data_field]): - song = _deserialize(song_data, schema_extra) - songs.insert(extra_songs_info[idx][0], song) + if private_songs_info: + private_song_ids = ','.join([str(id) for (_, id) in private_songs_info]) + private_songs_data = func_private(private_song_ids) + for idx, song_data in enumerate(private_songs_data[data_field]): + song = _deserialize(song_data, schema_private) + songs.insert(private_songs_info[idx][0], song) return songs diff --git a/fuo_netease/page_fav.py b/fuo_netease/page_fav.py index a0c39f3..37c243d 100644 --- a/fuo_netease/page_fav.py +++ b/fuo_netease/page_fav.py @@ -73,7 +73,7 @@ async def _upload_cloud_songs_bydir(self): if f.rsplit('.', 1)[-1] in exts]) for idx, path in enumerate(paths): - ok = await aio.run_fn(self._user.meta.provider.upload_song, path) + ok = await aio.run_fn(provider.upload_song, path) if ok: logger.warning(f'[{idx + 1}/{len(paths)}]{path} 上传成功!') else: @@ -90,7 +90,7 @@ async def _upload_cloud_songs(self): return for idx, path in enumerate(paths): - ok = await aio.run_fn(self._user.meta.provider.upload_song, path) + ok = await aio.run_fn(provider.upload_song, path) if ok: logger.warning(f'[{idx + 1}/{len(paths)}]{path} 上传成功!') else: