fuo-qqmusic 1.0.8__tar.gz → 1.0.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of fuo-qqmusic might be problematic. Click here for more details.
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/PKG-INFO +1 -1
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/README.md +6 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic/provider.py +6 -4
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic/provider_ui.py +12 -4
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic.egg-info/PKG-INFO +1 -1
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/setup.py +1 -1
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic/__init__.py +0 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic/api.py +0 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic/assets/icon.svg +0 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic/consts.py +0 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic/excs.py +0 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic/login.py +0 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic/schemas.py +0 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic.egg-info/SOURCES.txt +0 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic.egg-info/dependency_links.txt +0 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic.egg-info/entry_points.txt +0 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic.egg-info/requires.txt +0 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/fuo_qqmusic.egg-info/top_level.txt +0 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/setup.cfg +0 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/tests/test_api.py +0 -0
- {fuo_qqmusic-1.0.8 → fuo_qqmusic-1.0.10}/tests/test_provider.py +0 -0
|
@@ -20,6 +20,12 @@ pip3 install fuo-qqmusic
|
|
|
20
20
|
[操作示例](https://github.com/feeluown/feeluown-qqmusic/issues/6)。
|
|
21
21
|
|
|
22
22
|
## changelog
|
|
23
|
+
### 1.1.10 (2025-07-29)
|
|
24
|
+
- 修复歌曲链接会失效的问题(仅 FeelUOwn>=4.1.14 可用)
|
|
25
|
+
|
|
26
|
+
### 1.0.9 (2025-07-24)
|
|
27
|
+
- 增加“重新登录”按钮(仅 FeelUOwn>=4.1.14 可用)
|
|
28
|
+
|
|
23
29
|
### 1.0.8 (2025-07-03)
|
|
24
30
|
- 增强 web 登录可靠性
|
|
25
31
|
- 歌单支持添加/删除歌曲
|
|
@@ -183,7 +183,7 @@ class QQProvider(AbstractProvider, ProviderV2):
|
|
|
183
183
|
return Media(q_media_mapping[quality.value])
|
|
184
184
|
|
|
185
185
|
def video_list_quality(self, video):
|
|
186
|
-
q_media_mapping = self._model_cache_get_or_fetch(video, "q_url_mapping")
|
|
186
|
+
q_media_mapping = self._model_cache_get_or_fetch(video, "q_url_mapping", ttl=3600)
|
|
187
187
|
return [Quality.Video(k) for k, v in q_media_mapping.items() if v]
|
|
188
188
|
|
|
189
189
|
def song_list_quality(self, song) -> List[Quality.Audio]:
|
|
@@ -223,9 +223,11 @@ class QQProvider(AbstractProvider, ProviderV2):
|
|
|
223
223
|
q_media_mapping, exists = song.cache_get("q_media_mapping")
|
|
224
224
|
if exists is True:
|
|
225
225
|
return q_media_mapping
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
226
|
+
# 根据过去经验,这个东西一段时间之后会过期。
|
|
227
|
+
# 具体多久,不是很清楚。
|
|
228
|
+
quality_suffix = self._model_cache_get_or_fetch(song, "quality_suffix", ttl=3600)
|
|
229
|
+
mid = self._model_cache_get_or_fetch(song, "mid", ttl=3600)
|
|
230
|
+
media_id = self._model_cache_get_or_fetch(song, "media_id", ttl=3600)
|
|
229
231
|
q_media_mapping = {}
|
|
230
232
|
# 注:self.quality_suffix 这里可能会触发一次网络请求
|
|
231
233
|
for idx, (q, t, b, s) in enumerate(quality_suffix):
|
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import json
|
|
2
1
|
import logging
|
|
3
2
|
import os
|
|
4
3
|
|
|
4
|
+
from PyQt5.QtWidgets import QMenu
|
|
5
|
+
|
|
5
6
|
from feeluown.utils.dispatch import Signal
|
|
6
7
|
from feeluown.utils.aio import run_fn
|
|
7
|
-
from feeluown.consts import DATA_DIR
|
|
8
8
|
from feeluown.gui.widgets.login import CookiesLoginDialog, InvalidCookies
|
|
9
9
|
from feeluown.gui.provider_ui import AbstractProviderUi
|
|
10
10
|
from feeluown.app.gui_app import GuiApp
|
|
11
11
|
|
|
12
12
|
from .provider import provider
|
|
13
|
-
from .excs import QQIOError
|
|
14
13
|
from .login import read_cookies, write_cookies
|
|
15
14
|
|
|
16
15
|
logger = logging.getLogger(__name__)
|
|
@@ -29,7 +28,7 @@ class ProviderUI(AbstractProviderUi):
|
|
|
29
28
|
return os.path.join(os.path.dirname(__file__), 'assets', 'icon.svg')
|
|
30
29
|
|
|
31
30
|
def login_or_go_home(self):
|
|
32
|
-
if provider.
|
|
31
|
+
if not provider.has_current_user():
|
|
33
32
|
# According to #14, we have two ways to login:
|
|
34
33
|
# 1. the default way, as the code shows
|
|
35
34
|
# 2. a way for VIP user(maybe):
|
|
@@ -53,10 +52,19 @@ class ProviderUI(AbstractProviderUi):
|
|
|
53
52
|
def login_event(self):
|
|
54
53
|
return self._login_event
|
|
55
54
|
|
|
55
|
+
def context_menu_add_items(self, menu: QMenu):
|
|
56
|
+
action = menu.addAction('重新登录')
|
|
57
|
+
action.triggered.connect(self._re_login)
|
|
58
|
+
|
|
56
59
|
def on_login_succeed(self):
|
|
57
60
|
del self._dialog
|
|
58
61
|
self.login_event.emit(self, 1)
|
|
59
62
|
|
|
63
|
+
def _re_login(self):
|
|
64
|
+
provider.auth(None)
|
|
65
|
+
self.login_or_go_home()
|
|
66
|
+
|
|
67
|
+
|
|
60
68
|
|
|
61
69
|
class LoginDialog(CookiesLoginDialog):
|
|
62
70
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|