bandcampsync-tui 0.7.0__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.
- bandcampsync_tui-0.7.0/LICENSE +29 -0
- bandcampsync_tui-0.7.0/MANIFEST.in +1 -0
- bandcampsync_tui-0.7.0/PKG-INFO +279 -0
- bandcampsync_tui-0.7.0/README.md +232 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui/__init__.py +290 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui/__main__.py +117 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui/bandcamp.py +375 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui/config.py +2 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui/download.py +267 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui/ignores.py +121 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui/logger.py +13 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui/media.py +119 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui/notify.py +74 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui.egg-info/PKG-INFO +279 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui.egg-info/SOURCES.txt +23 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui.egg-info/dependency_links.txt +1 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui.egg-info/entry_points.txt +2 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui.egg-info/requires.txt +5 -0
- bandcampsync_tui-0.7.0/bandcampsync_tui.egg-info/top_level.txt +1 -0
- bandcampsync_tui-0.7.0/ignores.template.txt +11 -0
- bandcampsync_tui-0.7.0/requirements-lock.txt +17 -0
- bandcampsync_tui-0.7.0/requirements.txt +6 -0
- bandcampsync_tui-0.7.0/setup.cfg +7 -0
- bandcampsync_tui-0.7.0/setup.py +55 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023, meeb <meeb@meeb.org>
|
|
4
|
+
All rights reserved.
|
|
5
|
+
|
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
|
7
|
+
modification, are permitted provided that the following conditions are met:
|
|
8
|
+
|
|
9
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
17
|
+
contributors may be used to endorse or promote products derived from
|
|
18
|
+
this software without specific prior written permission.
|
|
19
|
+
|
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
23
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
24
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
25
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
26
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
27
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
28
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
include *.txt
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: bandcampsync-tui
|
|
3
|
+
Version: 0.7.0
|
|
4
|
+
Summary: A Python module and script to synchronise media purchased on bandcamp.com with a local directory. Fork of meeb/bandcampsync with Rich TUI and cross-platform improvements.
|
|
5
|
+
Home-page: https://codeberg.org/imigueldiaz/bandcampsync-tui
|
|
6
|
+
Author: Ignacio de Miguel Díaz
|
|
7
|
+
Author-email: imigueldiaz@tutamail.com
|
|
8
|
+
License: BSD-3-Clause
|
|
9
|
+
Project-URL: Homepage, https://codeberg.org/imigueldiaz/bandcampsync-tui
|
|
10
|
+
Project-URL: Bug Tracker, https://codeberg.org/imigueldiaz/bandcampsync-tui/issues
|
|
11
|
+
Project-URL: Source, https://codeberg.org/imigueldiaz/bandcampsync-tui
|
|
12
|
+
Project-URL: Changelog, https://codeberg.org/imigueldiaz/bandcampsync-tui/src/branch/main/CHANGELOG.md
|
|
13
|
+
Keywords: bandcampsync,bandcamp,media,sync,tui,download,music
|
|
14
|
+
Classifier: Development Status :: 4 - Beta
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Environment :: Console
|
|
24
|
+
Classifier: Topic :: Multimedia :: Sound/Audio
|
|
25
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
26
|
+
Requires-Python: >=3.8
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
License-File: LICENSE
|
|
29
|
+
Requires-Dist: curl_cffi
|
|
30
|
+
Requires-Dist: beautifulsoup4
|
|
31
|
+
Requires-Dist: html5lib
|
|
32
|
+
Requires-Dist: rich
|
|
33
|
+
Requires-Dist: setuptools
|
|
34
|
+
Dynamic: author
|
|
35
|
+
Dynamic: author-email
|
|
36
|
+
Dynamic: classifier
|
|
37
|
+
Dynamic: description
|
|
38
|
+
Dynamic: description-content-type
|
|
39
|
+
Dynamic: home-page
|
|
40
|
+
Dynamic: keywords
|
|
41
|
+
Dynamic: license
|
|
42
|
+
Dynamic: license-file
|
|
43
|
+
Dynamic: project-url
|
|
44
|
+
Dynamic: requires-dist
|
|
45
|
+
Dynamic: requires-python
|
|
46
|
+
Dynamic: summary
|
|
47
|
+
|
|
48
|
+
# BandcampSync-TUI
|
|
49
|
+
|
|
50
|
+
[](https://www.python.org/)
|
|
51
|
+
[](https://pypi.org/project/bandcampsync-tui/)
|
|
52
|
+
[](LICENSE)
|
|
53
|
+
[](https://www.python.org/psf/membership/)
|
|
54
|
+
|
|
55
|
+
> **🍴 Fork Notice**: This is a fork of
|
|
56
|
+
> [meeb/bandcampsync](https://github.com/meeb/bandcampsync) by
|
|
57
|
+
> [@meeb](https://github.com/meeb). The original project provided the foundation
|
|
58
|
+
> for this work. This fork extends it with a modern TUI, improved cross-platform
|
|
59
|
+
> support, and enhanced download capabilities. See
|
|
60
|
+
> [What's Different in This Fork](#-whats-different-in-this-fork) for details.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
**BandcampSync-TUI** is a Python module and command line script which
|
|
65
|
+
synchronises media purchased on a Bandcamp (<https://bandcamp.com/>) account
|
|
66
|
+
with a local directory.
|
|
67
|
+
|
|
68
|
+
You may use this to download media you have purchased from Bandcamp to a local
|
|
69
|
+
media server, such as Plex or Jellyfin.
|
|
70
|
+
|
|
71
|
+
Most media items purchased on Bandcamp have high quality download options
|
|
72
|
+
available and BandcampSync-TUI defaults to `flac`.
|
|
73
|
+
|
|
74
|
+

|
|
75
|
+
|
|
76
|
+
## ✨ What's Different in This Fork
|
|
77
|
+
|
|
78
|
+
This fork introduces several significant improvements over the original:
|
|
79
|
+
|
|
80
|
+
| Feature | Original | This Fork |
|
|
81
|
+
| ------------------- | ----------------- | ------------------------------------------------- |
|
|
82
|
+
| **Package Name** | `bandcampsync` | `bandcampsync-tui` |
|
|
83
|
+
| **User Interface** | Plain text output | Rich TUI with progress bars, spinners, and colors |
|
|
84
|
+
| **Download Speed** | Single-stream | Multi-part parallel downloads (4 threads) |
|
|
85
|
+
| **Windows Support** | Basic | Full cross-platform with proper path sanitization |
|
|
86
|
+
| **HTTP Client** | `requests` | `curl_cffi` (better anti-bot handling) |
|
|
87
|
+
| **Ethics** | — | [ETHICAL.md](ETHICAL.md) statement included |
|
|
88
|
+
|
|
89
|
+
### Key Improvements
|
|
90
|
+
|
|
91
|
+
- 🎨 **Beautiful TUI**: Progress bars with download speed/ETA, color-coded
|
|
92
|
+
messages, spinner animations
|
|
93
|
+
- 🏷️ **Download ID Visibility**: The TUI now displays the download item ID (e.g. `[ID 123456]`) in progress descriptions and status messages to make it easy to add items to the ignore file.
|
|
94
|
+
- ⚡ **Faster Downloads**: Large files (>5MB) download in parallel chunks
|
|
95
|
+
- 🖥️ **True Cross-Platform**: Handles Windows-forbidden characters, reserved
|
|
96
|
+
names, and temp file cleanup
|
|
97
|
+
- 🛡️ **Better Reliability**: Automatic retry with exponential backoff, graceful
|
|
98
|
+
error handling
|
|
99
|
+
- 📜 **Ethical Commitment**: See our [Ethical Statement](ETHICAL.md) for project
|
|
100
|
+
values
|
|
101
|
+
|
|
102
|
+
For a complete list of changes, see the [CHANGELOG](CHANGELOG.md).
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## How It Works
|
|
107
|
+
|
|
108
|
+
When called, `bandcampsync-tui` will:
|
|
109
|
+
|
|
110
|
+
1. Authenticate to bandcamp.com as you using your exported session cookies
|
|
111
|
+
2. Scan your local media directory for existing downloaded items
|
|
112
|
+
3. Index a list of all of your purchased items in your Bandcamp collection
|
|
113
|
+
4. Download the archive of missing items not downloaded already from your
|
|
114
|
+
collection
|
|
115
|
+
5. Unzip the archive and move the contents to the local media directory
|
|
116
|
+
|
|
117
|
+
The media directory will have the following format:
|
|
118
|
+
|
|
119
|
+
## Docker
|
|
120
|
+
|
|
121
|
+
This fork does not provide or maintain a Docker image. If you need a
|
|
122
|
+
containerised setup, please use the original project's Docker resources:
|
|
123
|
+
|
|
124
|
+
- Original project: <https://github.com/meeb/bandcampsync>
|
|
125
|
+
- Official image: ghcr.io/meeb/bandcampsync:latest
|
|
126
|
+
|
|
127
|
+
We recommend using the upstream project's image and examples for container
|
|
128
|
+
deployments, as they maintain the Docker artifacts and runbook. This repository
|
|
129
|
+
focuses on the interactive TUI and local improvements.
|
|
130
|
+
|
|
131
|
+
If you'd like, I can add a short compatibility note or a simple example showing
|
|
132
|
+
how to adapt the upstream Dockerfile for this fork — tell me and I'll draft it.
|
|
133
|
+
|
|
134
|
+
## Configuration
|
|
135
|
+
|
|
136
|
+
BandcampSync-TUI requires minimal configuration. First, it requires your session
|
|
137
|
+
cookies from an authenticated Bandcamp account. The easiest way to get this is
|
|
138
|
+
to go to <https://bandcamp.com/> in your browser and log in with your account.
|
|
139
|
+
|
|
140
|
+
Next, open the developer tools in your browser (F12 button on most browsers, or
|
|
141
|
+
select "developer tools" from the options menu).
|
|
142
|
+
|
|
143
|
+
Reload the index page and find the index page request in your network requests
|
|
144
|
+
tab of your browser. Go to the "Request Headers" section then select and copy
|
|
145
|
+
the string after the `Cookie` header. The string should look something like
|
|
146
|
+
this:
|
|
147
|
+
|
|
148
|
+
```text
|
|
149
|
+
client_id=00B1F3C8EB48E181A185CCD041E40C0E8F; session=1%0893C88%570EE405455%%8DEC37B5BC393983DB983DD%%BDFD46C3B8A0%%580DA466D5CD; identity=1%HhehuehUFEUiuebn%%2ADB72300DAE573%BEEF389A1B526EA35AC38019FA0A6F%11B4BD5FBC18B83F720; js_logged_in=1; logout=%7B%22username%22%3A%22someuser%22%7D; download_encoding=401; BACKENDID3=some-sever-name
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Save this string to a file called `cookies.txt`.
|
|
153
|
+
|
|
154
|
+

|
|
155
|
+
|
|
156
|
+
You need to save your session ID from cookies manually because Bandcamp has a
|
|
157
|
+
captcha on the login form so BandcampSync-TUI can't log in with your username
|
|
158
|
+
and password for you.
|
|
159
|
+
|
|
160
|
+
IMPORTANT NOTE: Keep the `cookies.txt` file safe! Anyone with access to this
|
|
161
|
+
file can log into your Bandcamp account, impersonate you, potentially make
|
|
162
|
+
purchases and generally have total access to your Bandcamp account!
|
|
163
|
+
|
|
164
|
+
You can also use Netscape formatted cookie export files if you have exported
|
|
165
|
+
your cookies using a cookie exporter plugin or similar tool.
|
|
166
|
+
|
|
167
|
+
## CLI usage
|
|
168
|
+
|
|
169
|
+
Once you have the Python `bandcampsync-tui` module installed you can call it
|
|
170
|
+
with the `bandcampsync-tui` command:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
bandcampsync-tui --cookies cookies.txt --directory /path/to/music
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
or in shorthand:
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
bandcampsync-tui -c cookies.txt -d /path/to/music
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
You can use `-t` or `--temp-dir` to set the temporary download directory used.
|
|
183
|
+
You can use `-i` or `--ignore` to bypass artists that have data issues that your
|
|
184
|
+
OS can not handle.
|
|
185
|
+
|
|
186
|
+
See `-h` or `--help` for the full list of command line options.
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
bandcampsync-tui --cookies cookies.txt --directory /path/to/music --ignore "badband"
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
`--ignore` supports multiple strings space separated strings, for example
|
|
193
|
+
`--ignore "band1 band2 band3"`.
|
|
194
|
+
|
|
195
|
+
You can use `-I` or `--ignore-file` to specify the path to a file containing
|
|
196
|
+
bandcamp ids of each item to skip.
|
|
197
|
+
|
|
198
|
+
```text
|
|
199
|
+
1546934218 # Chrome Sparks / Sparks EP
|
|
200
|
+
1418240212 # Chrome Sparks / Goddess EP
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
If you do, the items downloaded will be appended to the file, so that the next
|
|
204
|
+
time you run the script those items will not be re-downloaded. This means you
|
|
205
|
+
can use media managers such as Lidarr to rename artist, album and track names
|
|
206
|
+
automatically, rename the directory, or even move the items out of the download
|
|
207
|
+
directory without issues.
|
|
208
|
+
|
|
209
|
+
You can notify an external HTTP server when new items have been loaded with `-n`
|
|
210
|
+
or `--notify-url`.
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
bandcampsync ... --notify-url "http://some.service.local/some-uri"
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
You can use this to call a "refresh" hook on media servers (for example rescan a
|
|
217
|
+
Plex or Jellyfin library). The `--notify-url` parameter, if set, simply makes an
|
|
218
|
+
HTTP GET request to the specified URL and confirms it returns a `2XX` response.
|
|
219
|
+
|
|
220
|
+
For advanced notify URLs you can use the following `--notify-url` format:
|
|
221
|
+
|
|
222
|
+
`method url headers body`
|
|
223
|
+
|
|
224
|
+
`method` must be one of `GET` or `POST`. `url` is any URL. `headers` are a comma
|
|
225
|
+
separated list of `key=value` pairs and `body` is an body string to send if the
|
|
226
|
+
`method` is `POST`. You can use `-` for header and body values to leave them
|
|
227
|
+
unset. Some examples:
|
|
228
|
+
|
|
229
|
+
`GET http://some.service.local/some-uri - -`
|
|
230
|
+
|
|
231
|
+
`GET http://some.service.local/some-uri header1=abc,header2 -`
|
|
232
|
+
|
|
233
|
+
`POST http://some.service.local/some-uri auth-header=abc somedata`
|
|
234
|
+
|
|
235
|
+
## Formats
|
|
236
|
+
|
|
237
|
+
By default, BandcampSync will download your music in the `flac` format. You can
|
|
238
|
+
specify another format with the `--format` argument. Common Bandcamp download
|
|
239
|
+
formats are:
|
|
240
|
+
|
|
241
|
+
| Name | Description |
|
|
242
|
+
| --------------- | --------------------------------------------------------------- |
|
|
243
|
+
| `mp3-v0` | Variable bitrate MP3. Small file sizes. OK quality. |
|
|
244
|
+
| `mp3-320` | High quality MP3. Medium file sizes. Good quality. |
|
|
245
|
+
| `flac` | Lossless audio. Large file sizes. Original Quality. |
|
|
246
|
+
| `aac-hi` | Apple variable bitrate format. Small file sizes. OK quality. |
|
|
247
|
+
| `aiff-lossless` | Uncompressed audio format. Biggest file size. Original quality. |
|
|
248
|
+
| `vorbis` | Open source lossy format. Small file sizes. OK quality. |
|
|
249
|
+
| `alac` | Apple lossless format. Large file sizes. Original quality. |
|
|
250
|
+
| `wav` | Uncompressed audio format. Biggest file size. Original quality. |
|
|
251
|
+
|
|
252
|
+
## Contributing
|
|
253
|
+
|
|
254
|
+
All properly formatted and sensible pull requests, issues and comments are
|
|
255
|
+
welcome.
|
|
256
|
+
|
|
257
|
+
## Acknowledgments
|
|
258
|
+
|
|
259
|
+
This project is a fork of
|
|
260
|
+
**[meeb/bandcampsync](https://github.com/meeb/bandcampsync)** created by
|
|
261
|
+
[@meeb](https://github.com/meeb).
|
|
262
|
+
|
|
263
|
+
Thank you to the original author and all contributors for building the
|
|
264
|
+
foundation that made this fork possible.
|
|
265
|
+
|
|
266
|
+
## License
|
|
267
|
+
|
|
268
|
+
This project is licensed under the BSD 3-Clause License - see the
|
|
269
|
+
[LICENSE](LICENSE) file for details.
|
|
270
|
+
|
|
271
|
+
The original project by [@meeb](https://github.com/meeb) is also licensed under
|
|
272
|
+
the BSD 3-Clause License.
|
|
273
|
+
|
|
274
|
+
## Ethical Commitment
|
|
275
|
+
|
|
276
|
+
This project includes an [Ethical Statement](ETHICAL.md) that outlines our
|
|
277
|
+
values and principles regarding the responsible use of this software. We
|
|
278
|
+
encourage all users to read and consider these principles when using, modifying,
|
|
279
|
+
or distributing this software.
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# BandcampSync-TUI
|
|
2
|
+
|
|
3
|
+
[](https://www.python.org/)
|
|
4
|
+
[](https://pypi.org/project/bandcampsync-tui/)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](https://www.python.org/psf/membership/)
|
|
7
|
+
|
|
8
|
+
> **🍴 Fork Notice**: This is a fork of
|
|
9
|
+
> [meeb/bandcampsync](https://github.com/meeb/bandcampsync) by
|
|
10
|
+
> [@meeb](https://github.com/meeb). The original project provided the foundation
|
|
11
|
+
> for this work. This fork extends it with a modern TUI, improved cross-platform
|
|
12
|
+
> support, and enhanced download capabilities. See
|
|
13
|
+
> [What's Different in This Fork](#-whats-different-in-this-fork) for details.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
**BandcampSync-TUI** is a Python module and command line script which
|
|
18
|
+
synchronises media purchased on a Bandcamp (<https://bandcamp.com/>) account
|
|
19
|
+
with a local directory.
|
|
20
|
+
|
|
21
|
+
You may use this to download media you have purchased from Bandcamp to a local
|
|
22
|
+
media server, such as Plex or Jellyfin.
|
|
23
|
+
|
|
24
|
+
Most media items purchased on Bandcamp have high quality download options
|
|
25
|
+
available and BandcampSync-TUI defaults to `flac`.
|
|
26
|
+
|
|
27
|
+

|
|
28
|
+
|
|
29
|
+
## ✨ What's Different in This Fork
|
|
30
|
+
|
|
31
|
+
This fork introduces several significant improvements over the original:
|
|
32
|
+
|
|
33
|
+
| Feature | Original | This Fork |
|
|
34
|
+
| ------------------- | ----------------- | ------------------------------------------------- |
|
|
35
|
+
| **Package Name** | `bandcampsync` | `bandcampsync-tui` |
|
|
36
|
+
| **User Interface** | Plain text output | Rich TUI with progress bars, spinners, and colors |
|
|
37
|
+
| **Download Speed** | Single-stream | Multi-part parallel downloads (4 threads) |
|
|
38
|
+
| **Windows Support** | Basic | Full cross-platform with proper path sanitization |
|
|
39
|
+
| **HTTP Client** | `requests` | `curl_cffi` (better anti-bot handling) |
|
|
40
|
+
| **Ethics** | — | [ETHICAL.md](ETHICAL.md) statement included |
|
|
41
|
+
|
|
42
|
+
### Key Improvements
|
|
43
|
+
|
|
44
|
+
- 🎨 **Beautiful TUI**: Progress bars with download speed/ETA, color-coded
|
|
45
|
+
messages, spinner animations
|
|
46
|
+
- 🏷️ **Download ID Visibility**: The TUI now displays the download item ID (e.g. `[ID 123456]`) in progress descriptions and status messages to make it easy to add items to the ignore file.
|
|
47
|
+
- ⚡ **Faster Downloads**: Large files (>5MB) download in parallel chunks
|
|
48
|
+
- 🖥️ **True Cross-Platform**: Handles Windows-forbidden characters, reserved
|
|
49
|
+
names, and temp file cleanup
|
|
50
|
+
- 🛡️ **Better Reliability**: Automatic retry with exponential backoff, graceful
|
|
51
|
+
error handling
|
|
52
|
+
- 📜 **Ethical Commitment**: See our [Ethical Statement](ETHICAL.md) for project
|
|
53
|
+
values
|
|
54
|
+
|
|
55
|
+
For a complete list of changes, see the [CHANGELOG](CHANGELOG.md).
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## How It Works
|
|
60
|
+
|
|
61
|
+
When called, `bandcampsync-tui` will:
|
|
62
|
+
|
|
63
|
+
1. Authenticate to bandcamp.com as you using your exported session cookies
|
|
64
|
+
2. Scan your local media directory for existing downloaded items
|
|
65
|
+
3. Index a list of all of your purchased items in your Bandcamp collection
|
|
66
|
+
4. Download the archive of missing items not downloaded already from your
|
|
67
|
+
collection
|
|
68
|
+
5. Unzip the archive and move the contents to the local media directory
|
|
69
|
+
|
|
70
|
+
The media directory will have the following format:
|
|
71
|
+
|
|
72
|
+
## Docker
|
|
73
|
+
|
|
74
|
+
This fork does not provide or maintain a Docker image. If you need a
|
|
75
|
+
containerised setup, please use the original project's Docker resources:
|
|
76
|
+
|
|
77
|
+
- Original project: <https://github.com/meeb/bandcampsync>
|
|
78
|
+
- Official image: ghcr.io/meeb/bandcampsync:latest
|
|
79
|
+
|
|
80
|
+
We recommend using the upstream project's image and examples for container
|
|
81
|
+
deployments, as they maintain the Docker artifacts and runbook. This repository
|
|
82
|
+
focuses on the interactive TUI and local improvements.
|
|
83
|
+
|
|
84
|
+
If you'd like, I can add a short compatibility note or a simple example showing
|
|
85
|
+
how to adapt the upstream Dockerfile for this fork — tell me and I'll draft it.
|
|
86
|
+
|
|
87
|
+
## Configuration
|
|
88
|
+
|
|
89
|
+
BandcampSync-TUI requires minimal configuration. First, it requires your session
|
|
90
|
+
cookies from an authenticated Bandcamp account. The easiest way to get this is
|
|
91
|
+
to go to <https://bandcamp.com/> in your browser and log in with your account.
|
|
92
|
+
|
|
93
|
+
Next, open the developer tools in your browser (F12 button on most browsers, or
|
|
94
|
+
select "developer tools" from the options menu).
|
|
95
|
+
|
|
96
|
+
Reload the index page and find the index page request in your network requests
|
|
97
|
+
tab of your browser. Go to the "Request Headers" section then select and copy
|
|
98
|
+
the string after the `Cookie` header. The string should look something like
|
|
99
|
+
this:
|
|
100
|
+
|
|
101
|
+
```text
|
|
102
|
+
client_id=00B1F3C8EB48E181A185CCD041E40C0E8F; session=1%0893C88%570EE405455%%8DEC37B5BC393983DB983DD%%BDFD46C3B8A0%%580DA466D5CD; identity=1%HhehuehUFEUiuebn%%2ADB72300DAE573%BEEF389A1B526EA35AC38019FA0A6F%11B4BD5FBC18B83F720; js_logged_in=1; logout=%7B%22username%22%3A%22someuser%22%7D; download_encoding=401; BACKENDID3=some-sever-name
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Save this string to a file called `cookies.txt`.
|
|
106
|
+
|
|
107
|
+

|
|
108
|
+
|
|
109
|
+
You need to save your session ID from cookies manually because Bandcamp has a
|
|
110
|
+
captcha on the login form so BandcampSync-TUI can't log in with your username
|
|
111
|
+
and password for you.
|
|
112
|
+
|
|
113
|
+
IMPORTANT NOTE: Keep the `cookies.txt` file safe! Anyone with access to this
|
|
114
|
+
file can log into your Bandcamp account, impersonate you, potentially make
|
|
115
|
+
purchases and generally have total access to your Bandcamp account!
|
|
116
|
+
|
|
117
|
+
You can also use Netscape formatted cookie export files if you have exported
|
|
118
|
+
your cookies using a cookie exporter plugin or similar tool.
|
|
119
|
+
|
|
120
|
+
## CLI usage
|
|
121
|
+
|
|
122
|
+
Once you have the Python `bandcampsync-tui` module installed you can call it
|
|
123
|
+
with the `bandcampsync-tui` command:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
bandcampsync-tui --cookies cookies.txt --directory /path/to/music
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
or in shorthand:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
bandcampsync-tui -c cookies.txt -d /path/to/music
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
You can use `-t` or `--temp-dir` to set the temporary download directory used.
|
|
136
|
+
You can use `-i` or `--ignore` to bypass artists that have data issues that your
|
|
137
|
+
OS can not handle.
|
|
138
|
+
|
|
139
|
+
See `-h` or `--help` for the full list of command line options.
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
bandcampsync-tui --cookies cookies.txt --directory /path/to/music --ignore "badband"
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
`--ignore` supports multiple strings space separated strings, for example
|
|
146
|
+
`--ignore "band1 band2 band3"`.
|
|
147
|
+
|
|
148
|
+
You can use `-I` or `--ignore-file` to specify the path to a file containing
|
|
149
|
+
bandcamp ids of each item to skip.
|
|
150
|
+
|
|
151
|
+
```text
|
|
152
|
+
1546934218 # Chrome Sparks / Sparks EP
|
|
153
|
+
1418240212 # Chrome Sparks / Goddess EP
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
If you do, the items downloaded will be appended to the file, so that the next
|
|
157
|
+
time you run the script those items will not be re-downloaded. This means you
|
|
158
|
+
can use media managers such as Lidarr to rename artist, album and track names
|
|
159
|
+
automatically, rename the directory, or even move the items out of the download
|
|
160
|
+
directory without issues.
|
|
161
|
+
|
|
162
|
+
You can notify an external HTTP server when new items have been loaded with `-n`
|
|
163
|
+
or `--notify-url`.
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
bandcampsync ... --notify-url "http://some.service.local/some-uri"
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
You can use this to call a "refresh" hook on media servers (for example rescan a
|
|
170
|
+
Plex or Jellyfin library). The `--notify-url` parameter, if set, simply makes an
|
|
171
|
+
HTTP GET request to the specified URL and confirms it returns a `2XX` response.
|
|
172
|
+
|
|
173
|
+
For advanced notify URLs you can use the following `--notify-url` format:
|
|
174
|
+
|
|
175
|
+
`method url headers body`
|
|
176
|
+
|
|
177
|
+
`method` must be one of `GET` or `POST`. `url` is any URL. `headers` are a comma
|
|
178
|
+
separated list of `key=value` pairs and `body` is an body string to send if the
|
|
179
|
+
`method` is `POST`. You can use `-` for header and body values to leave them
|
|
180
|
+
unset. Some examples:
|
|
181
|
+
|
|
182
|
+
`GET http://some.service.local/some-uri - -`
|
|
183
|
+
|
|
184
|
+
`GET http://some.service.local/some-uri header1=abc,header2 -`
|
|
185
|
+
|
|
186
|
+
`POST http://some.service.local/some-uri auth-header=abc somedata`
|
|
187
|
+
|
|
188
|
+
## Formats
|
|
189
|
+
|
|
190
|
+
By default, BandcampSync will download your music in the `flac` format. You can
|
|
191
|
+
specify another format with the `--format` argument. Common Bandcamp download
|
|
192
|
+
formats are:
|
|
193
|
+
|
|
194
|
+
| Name | Description |
|
|
195
|
+
| --------------- | --------------------------------------------------------------- |
|
|
196
|
+
| `mp3-v0` | Variable bitrate MP3. Small file sizes. OK quality. |
|
|
197
|
+
| `mp3-320` | High quality MP3. Medium file sizes. Good quality. |
|
|
198
|
+
| `flac` | Lossless audio. Large file sizes. Original Quality. |
|
|
199
|
+
| `aac-hi` | Apple variable bitrate format. Small file sizes. OK quality. |
|
|
200
|
+
| `aiff-lossless` | Uncompressed audio format. Biggest file size. Original quality. |
|
|
201
|
+
| `vorbis` | Open source lossy format. Small file sizes. OK quality. |
|
|
202
|
+
| `alac` | Apple lossless format. Large file sizes. Original quality. |
|
|
203
|
+
| `wav` | Uncompressed audio format. Biggest file size. Original quality. |
|
|
204
|
+
|
|
205
|
+
## Contributing
|
|
206
|
+
|
|
207
|
+
All properly formatted and sensible pull requests, issues and comments are
|
|
208
|
+
welcome.
|
|
209
|
+
|
|
210
|
+
## Acknowledgments
|
|
211
|
+
|
|
212
|
+
This project is a fork of
|
|
213
|
+
**[meeb/bandcampsync](https://github.com/meeb/bandcampsync)** created by
|
|
214
|
+
[@meeb](https://github.com/meeb).
|
|
215
|
+
|
|
216
|
+
Thank you to the original author and all contributors for building the
|
|
217
|
+
foundation that made this fork possible.
|
|
218
|
+
|
|
219
|
+
## License
|
|
220
|
+
|
|
221
|
+
This project is licensed under the BSD 3-Clause License - see the
|
|
222
|
+
[LICENSE](LICENSE) file for details.
|
|
223
|
+
|
|
224
|
+
The original project by [@meeb](https://github.com/meeb) is also licensed under
|
|
225
|
+
the BSD 3-Clause License.
|
|
226
|
+
|
|
227
|
+
## Ethical Commitment
|
|
228
|
+
|
|
229
|
+
This project includes an [Ethical Statement](ETHICAL.md) that outlines our
|
|
230
|
+
values and principles regarding the responsible use of this software. We
|
|
231
|
+
encourage all users to read and consider these principles when using, modifying,
|
|
232
|
+
or distributing this software.
|