Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions bandcamp_dl/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,12 @@ def main():
action='store_true', default=conf.no_confirm)
parser.add_argument('--embed-genres', help='Embed album/track genres',
action='store_true', default=conf.embed_genres)
parser.add_argument('--truncate-album', metavar='LENGTH', type=int, default=0,
parser.add_argument('--truncate-album', metavar='LENGTH', type=int, default=conf.truncate_album,
help='Truncate album title to a maximum length. 0 for no limit.')
parser.add_argument('--truncate-track', metavar='LENGTH', type=int, default=0,
parser.add_argument('--truncate-track', metavar='LENGTH', type=int, default=conf.truncate_track,
help='Truncate track title to a maximum length. 0 for no limit.')
parser.add_argument('--limit-req-per-minute', type=int, default=conf.limit_req_per_minute,
help='Limit the number of requests sent per minute. 0 for no limit.')


arguments = parser.parse_args()
Expand All @@ -92,7 +94,7 @@ def main():
('ok_chars', config.OK_CHARS), ('space_char', config.SPACE_CHAR)]:
if not getattr(arguments, arg):
setattr(arguments, arg, val)
bandcamp = Bandcamp()
bandcamp = Bandcamp(limit_req_per_minute=arguments.limit_req_per_minute)

if arguments.artist and arguments.album:
urls = Bandcamp.generate_album_url(arguments.artist, arguments.album, "album")
Expand Down
16 changes: 12 additions & 4 deletions bandcamp_dl/bandcamp.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import bs4
import requests
from requests.adapters import HTTPAdapter
from requests_ratelimiter import LimiterAdapter
from urllib3.util import create_urllib3_context
from urllib.parse import urlparse, urlunparse, urljoin

Expand Down Expand Up @@ -51,17 +52,24 @@ def proxy_manager_for(self, *args, **kwargs):
ctx.set_ciphers(DEFAULT_CIPHERS)

class Bandcamp:
def __init__(self):
def __init__(self, limit_req_per_minute: int = 0):
self.headers = {'User-Agent': f'bandcamp-dl/{__version__} '
f'(https://github.com/evolution0/bandcamp-dl)'}
self.soup = None
self.tracks = None
self.logger = logging.getLogger("bandcamp-dl").getChild("Main")

# Mount the adapter with the custom SSL context to the session
self.session = requests.Session()
self.adapter = SSLAdapter(ssl_context=ctx)
self.session.mount('https://', self.adapter)
# Mount the adapter with the custom SSL context to the session
self.ssl_adapter = SSLAdapter(ssl_context=ctx)
self.session.mount('https://', self.ssl_adapter)

if 0 < limit_req_per_minute:
# Mount the rate-limiting adapter to the session
self.rate_adapter = LimiterAdapter(per_minute=limit_req_per_minute)
self.session.mount('https://', self.rate_adapter)
else:
self.rate_adapter = None

def parse(self, url: str, art: bool = True, lyrics: bool = False, genres: bool = False,
debugging: bool = False, cover_quality: int = 0) -> dict or None:
Expand Down
9 changes: 9 additions & 0 deletions bandcamp_dl/bandcampdownloader.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from mutagen import mp3
from mutagen import id3
import requests
from requests_ratelimiter import LimiterAdapter
import slugify

from bandcamp_dl import __version__
Expand All @@ -26,7 +27,15 @@ def __init__(self, config, urls=None):
"""
self.headers = {'User-Agent': f'bandcamp-dl/{__version__} '
f'(https://github.com/evolution0/bandcamp-dl)'}

self.session = requests.Session()
if 0 < config.limit_req_per_minute:
# Mount the rate-limiting adapter to the session
self.rate_adapter = LimiterAdapter(per_minute=config.limit_req_per_minute)
self.session.mount('https://', self.rate_adapter)
else:
self.rate_adapter = None

self.logger = logging.getLogger("bandcamp-dl").getChild("Downloader")

if type(urls) is str:
Expand Down
3 changes: 2 additions & 1 deletion bandcamp_dl/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ class Config(dict):
"cover_quality": 0,
"untitled_path_from_slug": False,
"truncate_album": 0,
"truncate_track": 0}
"truncate_track": 0,
"limit_req_per_minute": 0}

def __init__(self, dict_=None):
if dict_ is None:
Expand Down
5 changes: 3 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ dependencies = [
"requests >= 2.32.3",
"unicode-slugify >= 0.1.5",
"urllib3 >= 2.2.2",
"toml ; python_version < '3.11'"
"toml ; python_version < '3.11'",
"requests-ratelimiter >= 0.7.0",
]

license = {text = "Unlicense"}
Expand All @@ -37,4 +38,4 @@ bandcamp-dl = "bandcamp_dl.__main__:main"
[project.urls]
Documentation = "https://github.com/evolution0/bandcamp-dl/blob/master/README.rst"
Source = "https://github.com/evolution0/bandcamp-dl"
Tracker = "https://github.com/evolution0/bandcamp-dl/issues"
Tracker = "https://github.com/evolution0/bandcamp-dl/issues"