97 lines
3.6 KiB
Diff
97 lines
3.6 KiB
Diff
diff --git a/mopidy_bandcamp/bandcamp.py b/mopidy_bandcamp/bandcamp.py
|
|
index ff8c737..7d0b866 100644
|
|
--- a/mopidy_bandcamp/bandcamp.py
|
|
+++ b/mopidy_bandcamp/bandcamp.py
|
|
@@ -2,11 +2,38 @@ import json
|
|
import mopidy_bandcamp
|
|
import re
|
|
import requests
|
|
+import ssl
|
|
|
|
from html import unescape
|
|
from mopidy import httpclient
|
|
from time import time
|
|
+from requests.adapters import HTTPAdapter
|
|
|
|
+class BandcampHTTPAdapter(HTTPAdapter):
|
|
+ def init_poolmanager(self, *args, **kwargs):
|
|
+ context = ssl.create_default_context()
|
|
+ DEFAULT_CIPHERS = ":".join(
|
|
+ [
|
|
+ "ECDHE+AESGCM",
|
|
+ "ECDHE+CHACHA20",
|
|
+ "DHE+AESGCM",
|
|
+ "DHE+CHACHA20",
|
|
+ "ECDH+AESGCM",
|
|
+ "DH+AESGCM",
|
|
+ "ECDH+AES",
|
|
+ "DH+AES",
|
|
+ "RSA+AESGCM",
|
|
+ "RSA+AES",
|
|
+ "!aNULL",
|
|
+ "!eNULL",
|
|
+ "!MD5",
|
|
+ "!DSS",
|
|
+ "!AESCCM",
|
|
+ ]
|
|
+ )
|
|
+ context.set_ciphers(DEFAULT_CIPHERS)
|
|
+ kwargs["ssl_context"] = context
|
|
+ return super().init_poolmanager(*args, **kwargs)
|
|
|
|
class BandcampClient:
|
|
BASE_URL = "https://bandcamp.com/api"
|
|
@@ -43,6 +70,8 @@ class BandcampClient:
|
|
}
|
|
|
|
def __init__(self, config):
|
|
+ self.bandcamp_session = requests.Session()
|
|
+ self.bandcamp_session.mount("https://", BandcampHTTPAdapter())
|
|
self.proxy = httpclient.format_proxy(config["proxy"])
|
|
self.ua_str = httpclient.format_user_agent(
|
|
f"{mopidy_bandcamp.Extension.dist_name}/{mopidy_bandcamp.__version__}"
|
|
@@ -53,7 +82,7 @@ class BandcampClient:
|
|
|
|
def _get(self, *args, **kwargs):
|
|
headers = {"User-Agent": self.ua_str}
|
|
- resp = requests.get(*args, **kwargs, headers=headers, proxies=self.proxy)
|
|
+ resp = self.bandcamp_session.get(*args, **kwargs, headers=headers, proxies=self.proxy)
|
|
resp.raise_for_status()
|
|
js = resp.json()
|
|
if "error" in js:
|
|
@@ -62,7 +91,7 @@ class BandcampClient:
|
|
|
|
def _post(self, *args, **kwargs):
|
|
headers = {"User-Agent": self.ua_str}
|
|
- resp = requests.post(*args, **kwargs, headers=headers, proxies=self.proxy)
|
|
+ resp = self.bandcamp_session.post(*args, **kwargs, headers=headers, proxies=self.proxy)
|
|
resp.raise_for_status()
|
|
js = resp.json()
|
|
if "error" in js:
|
|
@@ -73,7 +102,7 @@ class BandcampClient:
|
|
headers = {"User-Agent": self.ua_str}
|
|
if self.identity:
|
|
headers["Cookie"] = f"identity={self.identity}"
|
|
- resp = requests.get(uri, headers=headers, proxies=self.proxy)
|
|
+ resp = self.bandcamp_session.get(uri, headers=headers, proxies=self.proxy)
|
|
resp.raise_for_status()
|
|
# Build the tralbum data by joining multiple json chunks.
|
|
data = re.search(r'\s+data-tralbum="(.*?)"', resp.text)
|
|
@@ -127,7 +156,7 @@ class BandcampClient:
|
|
return []
|
|
headers = {"User-Agent": self.ua_str, "Cookie": f"identity={self.identity}"}
|
|
if self.fan_id is None:
|
|
- resp = requests.get(
|
|
+ resp = self.bandcamp_session.get(
|
|
self.BASE_URL + "/fan/2/collection_summary",
|
|
headers=headers,
|
|
proxies=self.proxy,
|
|
@@ -141,7 +170,7 @@ class BandcampClient:
|
|
endpoint = "wishlist_items"
|
|
elif ctype == "following":
|
|
endpoint = "following_bands"
|
|
- resp = requests.post(
|
|
+ resp = self.bandcamp_session.post(
|
|
self.BASE_URL + "/fancollection/1/" + endpoint,
|
|
headers=headers,
|
|
proxies=self.proxy,
|