dotfiles/nixos/configs/music-server/001-fix-mopidy-bandcamp.patch

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,