diff --git a/fuo_ytmusic/__init__.py b/fuo_ytmusic/__init__.py index ccafe73..5ada55e 100644 --- a/fuo_ytmusic/__init__.py +++ b/fuo_ytmusic/__init__.py @@ -11,6 +11,7 @@ def init_config(config): # For example: http://127.0.0.1:7890. This will be used in API and media accessing. config.deffield('HTTP_PROXY', type_=str, default='', desc='YouTube Music HTTP proxy') + config.deffield('HTTP_TIMEOUT', type_=int, default=2, desc='HTTP requests timeout') def enable(app: App): @@ -20,6 +21,7 @@ def enable(app: App): from fuo_ytmusic.provider import provider provider.setup_http_proxy(app.config.ytmusic.HTTP_PROXY) + provider.setup_http_timeout(app.config.ytmusic.HTTP_TIMEOUT) app.library.register(provider) if app.mode & app.GuiMode: ui_mgr = ui_mgr or YtmusicUiManager(app) diff --git a/fuo_ytmusic/provider.py b/fuo_ytmusic/provider.py index 0b4886c..6053878 100644 --- a/fuo_ytmusic/provider.py +++ b/fuo_ytmusic/provider.py @@ -31,6 +31,9 @@ def setup_http_proxy(self, http_proxy): self._http_proxy = http_proxy self.service.setup_http_proxy(http_proxy) + def setup_http_timeout(self, timeout): + self.service.setup_timeout(timeout) + # noinspection PyPep8Naming class meta: identifier = 'ytmusic' diff --git a/fuo_ytmusic/service.py b/fuo_ytmusic/service.py index d488079..8c0bb44 100644 --- a/fuo_ytmusic/service.py +++ b/fuo_ytmusic/service.py @@ -6,11 +6,13 @@ import threading from datetime import timedelta from enum import Enum +from functools import partial from typing import Optional, Union, List from urllib.parse import unquote import requests from ytmusicapi import YTMusic as YTMusicBase +from ytmusicapi.ytmusic import OAuthCredentials from cachetools.func import ttl_cache from requests import Response from feeluown.library import SearchType @@ -225,7 +227,11 @@ def get_signature_timestamp(self): return self._signature_timestamp def _initialize_by_headerfile(self): - options = dict(requests_session=self._session, language="zh_CN") + options = dict( + requests_session=self._session, + language="zh_CN", + oauth_credentials=OAuthCredentials(session=self._session), + ) if HEADER_FILE.exists(): logger.info("Initializing ytmusic api with headerfile.") self._api = YTMusic(str(HEADER_FILE), **options) @@ -244,6 +250,13 @@ def setup_http_proxy(self, http_proxy): "https": http_proxy, } + def setup_timeout(self, timeout): + if isinstance(self._session.request, partial): + request = self._session.request.func + else: + request = self._session.request + self._session.request = partial(request, timeout=timeout) + def search( self, keywords: str,