pyrekordbox 0.2.0__py3-none-any.whl → 0.2.2__py3-none-any.whl
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.
- docs/Makefile +20 -0
- docs/make.bat +35 -0
- docs/source/_static/images/anlz_beat.svg +53 -0
- docs/source/_static/images/anlz_file.svg +204 -0
- docs/source/_static/images/anlz_pco2.svg +138 -0
- docs/source/_static/images/anlz_pcob.svg +148 -0
- docs/source/_static/images/anlz_pcp2.svg +398 -0
- docs/source/_static/images/anlz_pcpt.svg +263 -0
- docs/source/_static/images/anlz_ppth.svg +123 -0
- docs/source/_static/images/anlz_pqt2.svg +324 -0
- docs/source/_static/images/anlz_pqt2_2.svg +253 -0
- docs/source/_static/images/anlz_pqtz.svg +140 -0
- docs/source/_static/images/anlz_pssi.svg +192 -0
- docs/source/_static/images/anlz_pssi_entry.svg +191 -0
- docs/source/_static/images/anlz_pvbr.svg +125 -0
- docs/source/_static/images/anlz_pwav.svg +130 -0
- docs/source/_static/images/anlz_pwv3.svg +139 -0
- docs/source/_static/images/anlz_pwv4.svg +139 -0
- docs/source/_static/images/anlz_pwv5.svg +139 -0
- docs/source/_static/images/anlz_pwv5_entry.svg +100 -0
- docs/source/_static/images/anlz_pwv6.svg +130 -0
- docs/source/_static/images/anlz_pwv7.svg +139 -0
- docs/source/_static/images/anlz_pwvc.svg +125 -0
- docs/source/_static/images/anlz_tag.svg +110 -0
- docs/source/_static/logos/dark/logo_primary.svg +75 -0
- docs/source/_static/logos/light/logo_primary.svg +75 -0
- docs/source/_static/logos/mid/logo_primary.svg +75 -0
- docs/source/_templates/apidoc/module.rst_t +8 -0
- docs/source/_templates/apidoc/package.rst_t +57 -0
- docs/source/_templates/apidoc/toc.rst_t +7 -0
- docs/source/_templates/autosummary/class.rst +32 -0
- docs/source/_templates/autosummary/module.rst +55 -0
- docs/source/api.md +18 -0
- docs/source/conf.py +178 -0
- docs/source/development/changes.md +3 -0
- docs/source/development/contributing.md +3 -0
- docs/source/formats/anlz.md +634 -0
- docs/source/formats/db6.md +1233 -0
- docs/source/formats/mysetting.md +392 -0
- docs/source/formats/xml.md +376 -0
- docs/source/index.md +105 -0
- docs/source/installation.md +3 -0
- docs/source/quickstart.md +185 -0
- docs/source/requirements.txt +7 -0
- docs/source/tutorial/anlz.md +7 -0
- docs/source/tutorial/configuration.md +66 -0
- docs/source/tutorial/db6.md +179 -0
- docs/source/tutorial/index.md +20 -0
- docs/source/tutorial/mysetting.md +124 -0
- docs/source/tutorial/xml.md +140 -0
- pyrekordbox/__init__.py +1 -1
- pyrekordbox/__main__.py +16 -37
- pyrekordbox/_version.py +2 -2
- pyrekordbox/anlz/file.py +39 -0
- pyrekordbox/anlz/structs.py +3 -5
- pyrekordbox/config.py +71 -27
- pyrekordbox/db6/database.py +290 -61
- pyrekordbox/db6/registry.py +24 -0
- pyrekordbox/db6/tables.py +501 -340
- pyrekordbox/mysettings/file.py +0 -25
- pyrekordbox/utils.py +1 -1
- {pyrekordbox-0.2.0.dist-info → pyrekordbox-0.2.2.dist-info}/METADATA +42 -20
- pyrekordbox-0.2.2.dist-info/RECORD +80 -0
- {pyrekordbox-0.2.0.dist-info → pyrekordbox-0.2.2.dist-info}/top_level.txt +1 -0
- tests/test_config.py +175 -0
- tests/test_db6.py +95 -0
- pyrekordbox-0.2.0.dist-info/RECORD +0 -29
- {pyrekordbox-0.2.0.dist-info → pyrekordbox-0.2.2.dist-info}/LICENSE +0 -0
- {pyrekordbox-0.2.0.dist-info → pyrekordbox-0.2.2.dist-info}/WHEEL +0 -0
pyrekordbox/mysettings/file.py
CHANGED
@@ -49,31 +49,6 @@ CRC16_XMODEM_TABLE = [
|
|
49
49
|
RE_INVALID_KEY = re.compile("[_u][0-9]?", flags=re.IGNORECASE)
|
50
50
|
|
51
51
|
|
52
|
-
def crc16xmodem(data, crc=0):
|
53
|
-
"""Calculates the CRC-CCITT (XModem) variant of the CRC16 checksum.
|
54
|
-
|
55
|
-
Parameters
|
56
|
-
----------
|
57
|
-
data : bytes
|
58
|
-
The data used for calculating the CRC checksum.
|
59
|
-
crc : int, optional
|
60
|
-
The initial value.
|
61
|
-
|
62
|
-
Returns
|
63
|
-
-------
|
64
|
-
crc : int
|
65
|
-
The calculated CRC16-XModem checksum.
|
66
|
-
|
67
|
-
|
68
|
-
References
|
69
|
-
----------
|
70
|
-
https://reveng.sourceforge.io/crc-catalogue/all.htm#crc.cat.crc-16-xmodem
|
71
|
-
"""
|
72
|
-
for byte in data:
|
73
|
-
crc = ((crc << 8) & 0xFF00) ^ CRC16_XMODEM_TABLE[((crc >> 8) & 0xFF) ^ byte]
|
74
|
-
return crc & 0xFFFF
|
75
|
-
|
76
|
-
|
77
52
|
def compute_checksum(data, struct):
|
78
53
|
"""Computes the CRC16 XModem checksum for My-Setting files.
|
79
54
|
|
pyrekordbox/utils.py
CHANGED
@@ -58,8 +58,8 @@ def get_process_id(name: str, raise_exec=False) -> int:
|
|
58
58
|
23456
|
59
59
|
"""
|
60
60
|
for proc in psutil.process_iter():
|
61
|
-
proc_name = os.path.splitext(proc.name())[0] # needed on Windows (.exe)
|
62
61
|
try:
|
62
|
+
proc_name = os.path.splitext(proc.name())[0] # needed on Windows (.exe)
|
63
63
|
if proc_name == name:
|
64
64
|
return proc.pid
|
65
65
|
except (psutil.AccessDenied, psutil.NoSuchProcess):
|
@@ -1,14 +1,34 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: pyrekordbox
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.2
|
4
4
|
Summary: Inofficial Python package for interacting with the library of Pioneers Rekordbox DJ software.
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
Author-email: Dylan Jones <dylanljones94@gmail.com>
|
6
|
+
License: MIT License
|
7
|
+
|
8
|
+
Copyright (c) 2022-2023, Dylan Jones
|
9
|
+
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
12
|
+
in the Software without restriction, including without limitation the rights
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
15
|
+
furnished to do so, subject to the following conditions:
|
16
|
+
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
18
|
+
copies or substantial portions of the Software.
|
19
|
+
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
26
|
+
SOFTWARE.
|
27
|
+
|
9
28
|
Project-URL: Source, https://github.com/dylanljones/pyrekordbox
|
10
29
|
Project-URL: Documentation, https://pyrekordbox.readthedocs.io/en/stable/
|
11
30
|
Project-URL: Tracker, https://github.com/dylanljones/pyrekordbox/issues
|
31
|
+
Platform: any
|
12
32
|
Classifier: Development Status :: 3 - Alpha
|
13
33
|
Classifier: Intended Audience :: Developers
|
14
34
|
Classifier: Intended Audience :: Information Technology
|
@@ -30,19 +50,14 @@ License-File: LICENSE
|
|
30
50
|
Requires-Dist: bidict >=0.21.0
|
31
51
|
Requires-Dist: blowfish >=0.6.0
|
32
52
|
Requires-Dist: construct >=2.10.0
|
33
|
-
Requires-Dist: hypothesis >=6.0.0
|
34
53
|
Requires-Dist: numpy >=1.19.0
|
35
54
|
Requires-Dist: packaging
|
36
|
-
Requires-Dist: pytest >=6.2.0
|
37
55
|
Requires-Dist: psutil >=5.9.0
|
38
|
-
Requires-Dist:
|
39
|
-
Requires-Dist: setuptools-scm[toml] >=4
|
40
|
-
Requires-Dist: sqlalchemy ~=1.4.0
|
41
|
-
Provides-Extra: build
|
42
|
-
Requires-Dist: wheel >=0.37.0 ; extra == 'build'
|
56
|
+
Requires-Dist: sqlalchemy >=2.0.0
|
43
57
|
Provides-Extra: test
|
58
|
+
Requires-Dist: hypothesis >=6.0.0 ; extra == 'test'
|
59
|
+
Requires-Dist: pytest >=6.2.0 ; extra == 'test'
|
44
60
|
Requires-Dist: pytest-cov ; extra == 'test'
|
45
|
-
Requires-Dist: wheel >=0.37.0 ; extra == 'test'
|
46
61
|
|
47
62
|
|
48
63
|
<p align="center">
|
@@ -68,7 +83,7 @@ Pioneers Rekordbox DJ Software. It currently supports
|
|
68
83
|
- Analysis files (ANLZ)
|
69
84
|
- My-Setting files
|
70
85
|
|
71
|
-
Tested Rekordbox versions: ``5.8.6 | 6.5.3``
|
86
|
+
Tested Rekordbox versions: ``5.8.6 | 6.5.3 | 6.7.7``
|
72
87
|
|
73
88
|
|
74
89
|
|⚠️| This project is still under development and might contain bugs or have breaking API changes in the future. |
|
@@ -92,12 +107,12 @@ where `VERSION` is a release, tag or branch name.
|
|
92
107
|
|
93
108
|
Unlocking the new Rekordbox 6 `master.db` database file requires [SQLCipher][sqlcipher].
|
94
109
|
Pyrekordbox makes no attempt to download/install SQLCipher, as it is a
|
95
|
-
pure Python package - whereas the SQLCipher/
|
110
|
+
pure Python package - whereas the SQLCipher/sqlcipher3 installation is
|
96
111
|
platform-dependent and can not be installed via ``pip``.
|
97
112
|
|
98
113
|
#### Windows
|
99
114
|
|
100
|
-
SQLCipher can be used by building the libary against an amalgamation with [
|
115
|
+
SQLCipher can be used by building the libary against an amalgamation with [sqlcipher3].
|
101
116
|
For a detailed instruction, see [INSTALLATION].
|
102
117
|
|
103
118
|
#### MacOS
|
@@ -108,12 +123,13 @@ For MacOS follow these steps:
|
|
108
123
|
2) Install SQLCipher with `brew install SQLCipher`.
|
109
124
|
3) With the python environment you are using to run pyrekordbox active execute the following:
|
110
125
|
```shell
|
111
|
-
git clone https://github.com/
|
112
|
-
cd
|
126
|
+
git clone https://github.com/coleifer/sqlcipher3
|
127
|
+
cd sqlcipher3
|
113
128
|
SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==4 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py build
|
114
129
|
SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==4 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py install
|
115
130
|
```
|
116
131
|
Make sure the `C_INCLUDE` and `LIBRARY_PATH` point to the installed SQLCipher path. It may differ on your machine.
|
132
|
+
If you are having issues installing [sqlcipher3] on M1 Macs please refer to [INSTALLATION].
|
117
133
|
|
118
134
|
|
119
135
|
## 🚀 Quick-Start
|
@@ -184,7 +200,7 @@ So far only a few tables support adding or deleting entries:
|
|
184
200
|
- ``DjmdSongPlaylist``: Songs in a playlist
|
185
201
|
|
186
202
|
Starting from Rekordbox version ``6.6.5`` Pioneer obfuscated the ``app.asar`` file
|
187
|
-
contents, breaking the key extraction (see [this
|
203
|
+
contents, breaking the key extraction (see [this discussion](https://github.com/dylanljones/pyrekordbox/discussions/97) for more details).
|
188
204
|
If you are using a later version of Rekorbox and have no cached key from a previous
|
189
205
|
version, the database can not be unlocked automatically.
|
190
206
|
The command line interface of ``pyrekordbox`` provides a command for downloading
|
@@ -283,6 +299,8 @@ sync = mysett.get("sync")
|
|
283
299
|
quant = mysett.get("quantize")
|
284
300
|
````
|
285
301
|
|
302
|
+
The `DEVSETTING.DAT` file is still not supported
|
303
|
+
|
286
304
|
|
287
305
|
## 💡 File formats
|
288
306
|
|
@@ -302,6 +320,9 @@ If you encounter an issue or want to contribute to pyrekordbox, please feel free
|
|
302
320
|
`pyrekordbox` and the commit-message style can be found in
|
303
321
|
[CONTRIBUTING].
|
304
322
|
|
323
|
+
For general questions or discussions about Rekordbox, please use [GitHub Discussions][discussions]
|
324
|
+
instead of opening an issue.
|
325
|
+
|
305
326
|
Pyrekordbox is tested on Windows and MacOS, however some features can't be tested in
|
306
327
|
the CI setup since it requires a working Rekordbox installation.
|
307
328
|
|
@@ -353,13 +374,14 @@ the CI setup since it requires a working Rekordbox installation.
|
|
353
374
|
[mysettings-doc]: https://pyrekordbox.readthedocs.io/en/stable/formats/mysetting.html
|
354
375
|
|
355
376
|
[new-issue]: https://github.com/dylanljones/pyrekordbox/issues/new/choose
|
377
|
+
[discussions]: https://github.com/dylanljones/pyrekordbox/discussions
|
356
378
|
[CONTRIBUTING]: https://github.com/dylanljones/pyrekordbox/blob/master/CONTRIBUTING.md
|
357
379
|
[CHANGELOG]: https://github.com/dylanljones/pyrekordbox/blob/master/CHANGELOG.md
|
358
380
|
[INSTALLATION]: https://github.com/dylanljones/pyrekordbox/blob/master/INSTALLATION.md
|
359
381
|
|
360
382
|
[repo]: https://github.com/dylanljones/pyrekordbox
|
361
383
|
[sqlcipher]: https://www.zetetic.net/sqlcipher/open-source/
|
362
|
-
[
|
384
|
+
[sqlcipher3]: https://github.com/coleifer/sqlcipher3
|
363
385
|
[rekordcrate]: https://github.com/Holzhaus/rekordcrate
|
364
386
|
[crate-digger]: https://github.com/Deep-Symmetry/crate-digger
|
365
387
|
[supbox]: https://github.com/gabek/supbox
|
@@ -0,0 +1,80 @@
|
|
1
|
+
docs/Makefile,sha256=4zv3TVkTACm6JBaKgTES3ZI9cETXgM6ULbZkXZP1as8,638
|
2
|
+
docs/make.bat,sha256=s8EuuVXNRnn4xmWLWTpk3Z01aqJSJT8ymrmK6ux0zbc,769
|
3
|
+
docs/source/api.md,sha256=IKKMeQ2wFSS_ippOWJ63ELtMjfkNe27KjWcFFEdUXnE,276
|
4
|
+
docs/source/conf.py,sha256=lPfAJtd0VY7uEDmHrEfHvQzNJg6WN_1seM9pCFc2e6E,6244
|
5
|
+
docs/source/index.md,sha256=_73xtwAH2OF0btxHt2Kre4k1cP3N-OhsyDL-Oc7NKCI,2823
|
6
|
+
docs/source/installation.md,sha256=RoCHv74LONL5QyBBVKXPOOqRmAN2GUzcvInwnlztM6M,40
|
7
|
+
docs/source/quickstart.md,sha256=-v7FE_08KDSUAdbmvrY-7QImKLpR8vA3W6mTFE-uWPs,6299
|
8
|
+
docs/source/requirements.txt,sha256=7YYc-tO0BQcBVUa4GvM1r1G5Ma9gkwGZpNbAKlJL97s,117
|
9
|
+
docs/source/_static/images/anlz_beat.svg,sha256=cVooi17HFw3mOT39cFNB05tr-cZwbK_Hjmho6eBJNX8,2924
|
10
|
+
docs/source/_static/images/anlz_file.svg,sha256=E74hjyTFJRy6tCxyTPfsYoM0GmOKoY1To_eHatpPEjs,12320
|
11
|
+
docs/source/_static/images/anlz_pco2.svg,sha256=LAv_EZf72FbslKdHmuBy5ROWy8xKKkkXqp7mSk3WG20,8155
|
12
|
+
docs/source/_static/images/anlz_pcob.svg,sha256=w4NRLCj0EMMnQ2i6tnlE-nFxETSiTs8PQF5nxMI3bgo,8682
|
13
|
+
docs/source/_static/images/anlz_pcp2.svg,sha256=JDncv7fo6ylorWyaH7kZ6roYB7zryFbJE_HY4IfWG8E,24904
|
14
|
+
docs/source/_static/images/anlz_pcpt.svg,sha256=8PcHBFAHXrDnTyC_7rO0TM-5cGy8BfjIXWxDi0zEK8Y,16473
|
15
|
+
docs/source/_static/images/anlz_ppth.svg,sha256=-rPlwvBrrsYaL87GNI-WJJBFCYkcZwkWoGwH5NT8bLk,7124
|
16
|
+
docs/source/_static/images/anlz_pqt2.svg,sha256=sRvbV-DjoTIWtxwChaw6kBqKFXNqBCF4V9hru9ZtdiE,18386
|
17
|
+
docs/source/_static/images/anlz_pqt2_2.svg,sha256=8g3XCJDz8xbH_KK7CvMpmIZjaGrWBKQVlA4k4M3PF50,13774
|
18
|
+
docs/source/_static/images/anlz_pqtz.svg,sha256=OPlW76hPkbhOByYgmVQfucTpb5irZXYcASZokfpK3A0,8141
|
19
|
+
docs/source/_static/images/anlz_pssi.svg,sha256=zM8fsNshSMd0wDvO_qM7RzsAKVIEN8Y41jY76hBJjyQ,11684
|
20
|
+
docs/source/_static/images/anlz_pssi_entry.svg,sha256=YkUg7fXtUst0OBI6vIlhHCK-nzhmR-22UGKFQ0pHxxA,12095
|
21
|
+
docs/source/_static/images/anlz_pvbr.svg,sha256=7mA6S__F4AoX-GamftlevellDiTlcIWRWi77A7HZEDg,7284
|
22
|
+
docs/source/_static/images/anlz_pwav.svg,sha256=psm3g7ILLVNgPNmPG2Hy7k9-q7qmnMnyQ3_-XYVAW2g,7566
|
23
|
+
docs/source/_static/images/anlz_pwv3.svg,sha256=FwZJIiHj5hj-FB-cioNlxrGBeIEuZy2BOLEzSWC57IE,8389
|
24
|
+
docs/source/_static/images/anlz_pwv4.svg,sha256=k5GQu2N965zPSG0FQWuml96UMfqBvs8Vy-Emklvn2dI,8173
|
25
|
+
docs/source/_static/images/anlz_pwv5.svg,sha256=Ph1TSlji2BgWK3rVI7MvnpGM68wef1s-Hs6OlmC0oQQ,8173
|
26
|
+
docs/source/_static/images/anlz_pwv5_entry.svg,sha256=TyNh_6gIsQKuDvS0RO5tmsptzmxiQ-LL1L3DQdIFi4I,5648
|
27
|
+
docs/source/_static/images/anlz_pwv6.svg,sha256=J2KvE_bI-NTFSpFp7QsKSsgbWGCyuUAuW_dOgdnv2DY,7577
|
28
|
+
docs/source/_static/images/anlz_pwv7.svg,sha256=n5NsTErvfsCw-otWdVXn12lM0tHyh-zQDZsZtQOJf0U,8173
|
29
|
+
docs/source/_static/images/anlz_pwvc.svg,sha256=wO_tsxRDVnAbptbSZYK1z7YOH-0vNUqXDB9Udj4ungA,7128
|
30
|
+
docs/source/_static/images/anlz_tag.svg,sha256=owPTtrTRDYCkaSg32_UJ-MTZp3K6WlkRQdJHTzdtxqs,6188
|
31
|
+
docs/source/_static/logos/dark/logo_primary.svg,sha256=pH4Q28u9JaCA4dVrKB-NDy00PNw2EhDwz7fIYUzezvk,3079
|
32
|
+
docs/source/_static/logos/light/logo_primary.svg,sha256=MUbYjowOcWdtoHVnK7pyV9xcTRdm7gS4whw94pVMGSI,3080
|
33
|
+
docs/source/_static/logos/mid/logo_primary.svg,sha256=utCWWbXXW5auRRposMMaMO9t_AflsN13rZGo3_Pg2WE,3078
|
34
|
+
docs/source/_templates/apidoc/module.rst_t,sha256=keQqb9G8LA-JS5tuytgzfsxRXsADEvuOz3mJjY9qYHU,185
|
35
|
+
docs/source/_templates/apidoc/package.rst_t,sha256=Ra-lunZcMyDtrb6vgrfAnBcBW4eFMTEIyg12fSe9h4o,1173
|
36
|
+
docs/source/_templates/apidoc/toc.rst_t,sha256=6EfpNwcRXLa8Ae3NcovuSmV5PSBy5gP0t6XfphUYb7M,127
|
37
|
+
docs/source/_templates/autosummary/class.rst,sha256=5yRMWkUNDXGvQE1gGm6yisL1bX4BDOsaBPciNUs_6vA,579
|
38
|
+
docs/source/_templates/autosummary/module.rst,sha256=xSCcWeBqQdMgpese2OwFlvzSOMsPZKTBCLCwgD3OG4k,789
|
39
|
+
docs/source/development/changes.md,sha256=ys1_zvYKQWEak_mBXBUMLpO3CWriHpjSAg1-17mTk04,40
|
40
|
+
docs/source/development/contributing.md,sha256=7bERN03kHo2Wf0ZrgHYP4MfBSdFGmE_Kk0CxK0uay2I,43
|
41
|
+
docs/source/formats/anlz.md,sha256=P7FrPqbu3i8SlRKVV9IU9cOQajKJHOjLlAWHheDGN7c,21455
|
42
|
+
docs/source/formats/db6.md,sha256=fuB1_PaalHV4zRkhXh5_mn1ZgHfPnSu_OzUOYbVls6w,30121
|
43
|
+
docs/source/formats/mysetting.md,sha256=OIYIn_B2HJcJtJM0wNjjzPy3xPkyz4raxg_-Y6E3D1k,9746
|
44
|
+
docs/source/formats/xml.md,sha256=uL7eWWQfQXsyf55Vydt1iLq7Jzio3kIGbSfjpg5-CRY,8491
|
45
|
+
docs/source/tutorial/anlz.md,sha256=JtcQIy44qaSP_GL0aL9VYQYOX8aVju7uFxgN3FPNy9o,145
|
46
|
+
docs/source/tutorial/configuration.md,sha256=mqmeFM3I7pDA_ajPQWqVyvc9Y0PWGYXLr3yyojTGsL8,2127
|
47
|
+
docs/source/tutorial/db6.md,sha256=wzfHAxSQ5rmYSDs6S0WheDwjkdFYsY3JxM0jGmXJcVU,6730
|
48
|
+
docs/source/tutorial/index.md,sha256=zjx5uXESYzHIyeqtL4XjhZUDPOpNiutZ3gkUOeG8R9w,318
|
49
|
+
docs/source/tutorial/mysetting.md,sha256=su-WMvEd3DrFF32RDfQBm3TlAUgK5PRPT1n_77BYnvY,3659
|
50
|
+
docs/source/tutorial/xml.md,sha256=x_rFvsVzZtUV0upEkPWkgrmr3B-FYjZKWvBuJBLFAu0,6414
|
51
|
+
pyrekordbox/__init__.py,sha256=jNxA9t2zA1P6zuOaQ9T_Nc5QW-G_KpUWymLNKOkPf7s,645
|
52
|
+
pyrekordbox/__main__.py,sha256=dm9QQMM5xPXzvFsF1ghwBor8ThUvZuC73As8c6kMZrA,6040
|
53
|
+
pyrekordbox/_version.py,sha256=RrHB9KG1O3GPm--rbTedqmZbdDrbgeRLXBmT4OBUqqI,411
|
54
|
+
pyrekordbox/config.py,sha256=eifT5Wejkk9zbQQ6190h-rF5WiF9foc55SNCHaYJKZk,21848
|
55
|
+
pyrekordbox/logger.py,sha256=qCY_3L_3WIMAvNmVKvh7oshGlWrd0T5aIW1bNCIu3Lo,521
|
56
|
+
pyrekordbox/utils.py,sha256=sT1xt-rM94Dir-S0OSSqKbquf9kdFbzZvBu3-7q0QDM,4361
|
57
|
+
pyrekordbox/xml.py,sha256=0qsKc8SQa54URwWGt6oHTOHBiAQU2S8MbSxDbzKUB7A,38369
|
58
|
+
pyrekordbox/anlz/__init__.py,sha256=OSpyl3pmmnt3mG905J9qvNnYchsgrIfathw0QXoOhjo,3156
|
59
|
+
pyrekordbox/anlz/file.py,sha256=i6Cnz-XpT47ClGhC3ZCCrgKhlk685NTM0hWyOuATNaE,6949
|
60
|
+
pyrekordbox/anlz/structs.py,sha256=Lt4fkb3SAE8w146eWeWGnpgRoP6jhLMWrSMoMwPjG04,7925
|
61
|
+
pyrekordbox/anlz/tags.py,sha256=uqneBP9CstYy7a4IpeEC9A5tfI59DQm0ik7yFXk_dNo,14094
|
62
|
+
pyrekordbox/db6/__init__.py,sha256=5XbfEIZuribNXIHMn9M4qw91cKHouH82PPJbmODhdgo,849
|
63
|
+
pyrekordbox/db6/aux_files.py,sha256=t0SfMCXBHjlCSfgRfpw1RTj0cmV0QY07xSLepjQqMnY,7591
|
64
|
+
pyrekordbox/db6/database.py,sha256=FlLeJgTp3-kt63_q5uod9Hzb5u83Z34Vhb9qI_qnYVM,74218
|
65
|
+
pyrekordbox/db6/registry.py,sha256=9GwMDKMqtm3-4nZ7mdzbL6XezPcVJUVqjHXGHKG_Jn4,9556
|
66
|
+
pyrekordbox/db6/tables.py,sha256=5ijJyO0OERbj1Usc__2QLRc7lPZ6FYluOXbajaEqzqk,65949
|
67
|
+
pyrekordbox/mysettings/__init__.py,sha256=rMS6Kknf1-X3PXF_TUxm8xui0H1Ap3R7G_9mqlnQUAM,705
|
68
|
+
pyrekordbox/mysettings/file.py,sha256=dQEsdBivpverXCssyVNUeQyUXIooNrOGIIiPLwi_6T4,12669
|
69
|
+
pyrekordbox/mysettings/structs.py,sha256=5Y1F3qTmsP1fRB39_BEHpQVxKx2DO9BytEuJUG_RNcY,8472
|
70
|
+
tests/__init__.py,sha256=s321RtRiHJsLt0YFq0NRncW7u66uwYHQE-6IjPcg10o,67
|
71
|
+
tests/test_anlz.py,sha256=hZAW5GFEJpU8UmmHYLuU5OZlApGrWZyPAR79KtaR0cw,5782
|
72
|
+
tests/test_config.py,sha256=wYp4wHRhIk2grhGXhk4z9umrhOWhVvTOm2mHydzLEs8,6157
|
73
|
+
tests/test_db6.py,sha256=6GUH_B1UAYfnJtjTK20cdCjP6hz_kDRR4KklvsnuAXg,37488
|
74
|
+
tests/test_mysetting.py,sha256=te6B_BErGc6ThgBpAl45n0Nd0hWJcm-X9WTw14bR6MA,5781
|
75
|
+
tests/test_xml.py,sha256=CbdzWgVjLwmxdaUqLo58QN4iRRaUdiJe_ni8y37BVfQ,16852
|
76
|
+
pyrekordbox-0.2.2.dist-info/LICENSE,sha256=Au8sngdQ79q5JsZXZJVU13j46VDxFbPwC4x6sSz8Jes,1074
|
77
|
+
pyrekordbox-0.2.2.dist-info/METADATA,sha256=jihtF6wZM3UKWuzrGLAxL-oOv4HjGyp-mwMbxdXmSB8,16672
|
78
|
+
pyrekordbox-0.2.2.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
79
|
+
pyrekordbox-0.2.2.dist-info/top_level.txt,sha256=Cv8QDfcJ7y8fYUm0Q8D5GoiGxaqb7qt8Z5ntVbj1cLk,23
|
80
|
+
pyrekordbox-0.2.2.dist-info/RECORD,,
|
tests/test_config.py
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Author: Dylan Jones
|
3
|
+
# Date: 2023-10-02
|
4
|
+
|
5
|
+
import pytest
|
6
|
+
import json
|
7
|
+
from pathlib import Path
|
8
|
+
from pyrekordbox.config import update_config, get_config
|
9
|
+
|
10
|
+
RB_SETTING = """<?xml version="1.0" encoding="UTF-8"?>
|
11
|
+
<PROPERTIES><VALUE name="masterDbDirectory" val="{db_dir}"/></PROPERTIES>
|
12
|
+
"""
|
13
|
+
|
14
|
+
RB_OPTIONS = {"options": [["db-path", ""]]}
|
15
|
+
|
16
|
+
|
17
|
+
def mock_rekordbox_settings_file(pioneer_app_dir, rb_app_dir):
|
18
|
+
db_dir = pioneer_app_dir / "rekordbox"
|
19
|
+
text = RB_SETTING.format(db_dir=db_dir)
|
20
|
+
file = rb_app_dir / "rekordbox3.settings"
|
21
|
+
file.write_text(text)
|
22
|
+
|
23
|
+
|
24
|
+
def mock_rekordbox_options_file(agent_storage_dir, db_path):
|
25
|
+
file = agent_storage_dir / "options.json"
|
26
|
+
options = RB_OPTIONS.copy()
|
27
|
+
options["options"][0][1] = str(db_path)
|
28
|
+
with open(file, "w") as fp:
|
29
|
+
json.dump(options, fp)
|
30
|
+
|
31
|
+
|
32
|
+
@pytest.fixture(scope="session")
|
33
|
+
def pioneer_app_dir(tmp_path_factory):
|
34
|
+
root = tmp_path_factory.mktemp("Pioneer")
|
35
|
+
rb_dir = root / "rekordbox"
|
36
|
+
rb6_dir = root / "rekordbox6"
|
37
|
+
agent_storage_dir = root / "rekordboxAgent" / "storage"
|
38
|
+
rb_dir.mkdir(parents=True)
|
39
|
+
rb6_dir.mkdir(parents=True)
|
40
|
+
agent_storage_dir.mkdir(parents=True)
|
41
|
+
|
42
|
+
# Mock `rekordbox3.settings` files
|
43
|
+
mock_rekordbox_settings_file(root, rb_dir)
|
44
|
+
mock_rekordbox_settings_file(root, rb6_dir)
|
45
|
+
|
46
|
+
# Mock database files
|
47
|
+
rb5_db = rb_dir / "datafile.edb"
|
48
|
+
rb6_db = rb_dir / "master.db"
|
49
|
+
rb5_db.touch()
|
50
|
+
rb6_db.touch()
|
51
|
+
|
52
|
+
# Mock `options.json` file (RBv6)
|
53
|
+
mock_rekordbox_options_file(agent_storage_dir, rb6_db)
|
54
|
+
|
55
|
+
return root
|
56
|
+
|
57
|
+
|
58
|
+
@pytest.fixture(scope="session")
|
59
|
+
def pioneer_install_dir(tmp_path_factory):
|
60
|
+
root = tmp_path_factory.mktemp("Pioneer")
|
61
|
+
rb5_dir = root / "rekordbox 5.1.1"
|
62
|
+
rb6_dir = root / "rekordbox 6.1.1"
|
63
|
+
rb5_dir_alt = root / "rekordbox 5.1.2"
|
64
|
+
rb6_dir_alt = root / "rekordbox 6.1.2"
|
65
|
+
|
66
|
+
rb5_dir.mkdir(parents=True)
|
67
|
+
rb6_dir.mkdir(parents=True)
|
68
|
+
rb5_dir_alt.mkdir(parents=True)
|
69
|
+
rb6_dir_alt.mkdir(parents=True)
|
70
|
+
return root
|
71
|
+
|
72
|
+
|
73
|
+
def test_pioneer_config(pioneer_install_dir, pioneer_app_dir):
|
74
|
+
update_config(pioneer_install_dir, pioneer_app_dir)
|
75
|
+
install_dir = get_config("pioneer", "install_dir")
|
76
|
+
app_dir = get_config("pioneer", "app_dir")
|
77
|
+
|
78
|
+
assert isinstance(install_dir, Path)
|
79
|
+
assert isinstance(app_dir, Path)
|
80
|
+
assert install_dir == pioneer_install_dir
|
81
|
+
assert app_dir == pioneer_app_dir
|
82
|
+
|
83
|
+
|
84
|
+
def test_rb5_config(pioneer_install_dir, pioneer_app_dir):
|
85
|
+
update_config(pioneer_install_dir, pioneer_app_dir)
|
86
|
+
expected_version = "5.1.2"
|
87
|
+
|
88
|
+
app_dir = get_config("rekordbox5", "app_dir")
|
89
|
+
install_dir = get_config("rekordbox5", "install_dir")
|
90
|
+
db_dir = get_config("rekordbox5", "db_dir")
|
91
|
+
db_path = get_config("rekordbox5", "db_path")
|
92
|
+
version = get_config("rekordbox5", "version")
|
93
|
+
|
94
|
+
assert isinstance(install_dir, Path)
|
95
|
+
assert isinstance(app_dir, Path)
|
96
|
+
assert isinstance(db_dir, Path)
|
97
|
+
assert isinstance(db_path, Path)
|
98
|
+
assert install_dir == (pioneer_install_dir / f"rekordbox {expected_version}")
|
99
|
+
assert app_dir == (pioneer_app_dir / "rekordbox")
|
100
|
+
assert db_dir == (pioneer_app_dir / "rekordbox")
|
101
|
+
assert db_path == (pioneer_app_dir / "rekordbox" / "datafile.edb")
|
102
|
+
assert version == expected_version
|
103
|
+
|
104
|
+
|
105
|
+
def test_rb6_config(pioneer_install_dir, pioneer_app_dir):
|
106
|
+
update_config(pioneer_install_dir, pioneer_app_dir)
|
107
|
+
expected_version = "6.1.2"
|
108
|
+
|
109
|
+
app_dir = get_config("rekordbox6", "app_dir")
|
110
|
+
install_dir = get_config("rekordbox6", "install_dir")
|
111
|
+
db_dir = get_config("rekordbox6", "db_dir")
|
112
|
+
db_path = get_config("rekordbox6", "db_path")
|
113
|
+
version = get_config("rekordbox6", "version")
|
114
|
+
|
115
|
+
assert isinstance(install_dir, Path)
|
116
|
+
assert isinstance(app_dir, Path)
|
117
|
+
assert isinstance(db_dir, Path)
|
118
|
+
assert isinstance(db_path, Path)
|
119
|
+
assert install_dir == (pioneer_install_dir / f"rekordbox {expected_version}")
|
120
|
+
assert app_dir == (pioneer_app_dir / "rekordbox6")
|
121
|
+
assert db_dir == (pioneer_app_dir / "rekordbox")
|
122
|
+
assert db_path == (pioneer_app_dir / "rekordbox" / "master.db")
|
123
|
+
assert version == expected_version
|
124
|
+
|
125
|
+
|
126
|
+
def test_rb5_config_alt(pioneer_install_dir, pioneer_app_dir):
|
127
|
+
# test default: latest version
|
128
|
+
update_config(pioneer_install_dir, pioneer_app_dir)
|
129
|
+
expected_version = "5.1.2"
|
130
|
+
|
131
|
+
app_dir = get_config("rekordbox5", "app_dir")
|
132
|
+
install_dir = get_config("rekordbox5", "install_dir")
|
133
|
+
version = get_config("rekordbox5", "version")
|
134
|
+
assert install_dir == (pioneer_install_dir / f"rekordbox {expected_version}")
|
135
|
+
assert app_dir == (pioneer_app_dir / "rekordbox")
|
136
|
+
assert version == expected_version
|
137
|
+
|
138
|
+
# test alternative version
|
139
|
+
update_config(
|
140
|
+
pioneer_install_dir, pioneer_app_dir, rb5_install_dirname="rekordbox 5.1.1"
|
141
|
+
)
|
142
|
+
expected_version = "5.1.1"
|
143
|
+
|
144
|
+
app_dir = get_config("rekordbox5", "app_dir")
|
145
|
+
install_dir = get_config("rekordbox5", "install_dir")
|
146
|
+
version = get_config("rekordbox5", "version")
|
147
|
+
assert install_dir == (pioneer_install_dir / f"rekordbox {expected_version}")
|
148
|
+
assert app_dir == (pioneer_app_dir / "rekordbox")
|
149
|
+
assert version == expected_version
|
150
|
+
|
151
|
+
|
152
|
+
def test_rb6_config_alt(pioneer_install_dir, pioneer_app_dir):
|
153
|
+
# test default: latest version
|
154
|
+
update_config(pioneer_install_dir, pioneer_app_dir)
|
155
|
+
expected_version = "6.1.2"
|
156
|
+
|
157
|
+
app_dir = get_config("rekordbox6", "app_dir")
|
158
|
+
install_dir = get_config("rekordbox6", "install_dir")
|
159
|
+
version = get_config("rekordbox6", "version")
|
160
|
+
assert install_dir == (pioneer_install_dir / f"rekordbox {expected_version}")
|
161
|
+
assert app_dir == (pioneer_app_dir / "rekordbox6")
|
162
|
+
assert version == expected_version
|
163
|
+
|
164
|
+
# test alternative version
|
165
|
+
update_config(
|
166
|
+
pioneer_install_dir, pioneer_app_dir, rb6_install_dirname="rekordbox 6.1.1"
|
167
|
+
)
|
168
|
+
expected_version = "6.1.1"
|
169
|
+
|
170
|
+
app_dir = get_config("rekordbox6", "app_dir")
|
171
|
+
install_dir = get_config("rekordbox6", "install_dir")
|
172
|
+
version = get_config("rekordbox6", "version")
|
173
|
+
assert install_dir == (pioneer_install_dir / f"rekordbox {expected_version}")
|
174
|
+
assert app_dir == (pioneer_app_dir / "rekordbox6")
|
175
|
+
assert version == expected_version
|
tests/test_db6.py
CHANGED
@@ -187,6 +187,23 @@ def test_songs_getters(parent_name, key, cls):
|
|
187
187
|
assert isinstance(query.first(), cls)
|
188
188
|
|
189
189
|
|
190
|
+
def test_mixer_gain_setters(db):
|
191
|
+
for item in db.get_mixer_param():
|
192
|
+
# Check Gain setter
|
193
|
+
low, high, value = int(item.GainLow), int(item.GainHigh), item.Gain
|
194
|
+
item.Gain = value
|
195
|
+
db.flush()
|
196
|
+
assert item.GainLow == low
|
197
|
+
assert item.GainHigh == high
|
198
|
+
|
199
|
+
# Check Peak setter
|
200
|
+
low, high, value = int(item.PeakLow), int(item.PeakHigh), item.Peak
|
201
|
+
item.Peak = value
|
202
|
+
db.flush()
|
203
|
+
assert item.PeakLow == low
|
204
|
+
assert item.PeakHigh == high
|
205
|
+
|
206
|
+
|
190
207
|
@mark.parametrize(
|
191
208
|
"search,ids",
|
192
209
|
[
|
@@ -981,6 +998,84 @@ def test_rename_playlist(db):
|
|
981
998
|
assert _check_playlist_xml(db)
|
982
999
|
|
983
1000
|
|
1001
|
+
def test_add_album(db):
|
1002
|
+
old_usn = db.get_local_usn()
|
1003
|
+
name = "test"
|
1004
|
+
db.add_album(name)
|
1005
|
+
db.commit()
|
1006
|
+
|
1007
|
+
# Check that album was created and USN is incremented
|
1008
|
+
instance = db.get_album(Name=name).one()
|
1009
|
+
assert instance.Name == name
|
1010
|
+
assert instance.rb_local_usn == old_usn + 1
|
1011
|
+
assert db.get_local_usn() == old_usn + 1
|
1012
|
+
|
1013
|
+
# Fail if album with same name is added
|
1014
|
+
with pytest.raises(ValueError):
|
1015
|
+
db.add_album(name)
|
1016
|
+
|
1017
|
+
# Add album with album artist by artist
|
1018
|
+
artist = db.get_artist().first()
|
1019
|
+
album = db.add_album("album 2", artist=artist)
|
1020
|
+
assert album.AlbumArtistID == artist.ID
|
1021
|
+
|
1022
|
+
# Add album with album artist by ID
|
1023
|
+
artist = db.get_artist().first()
|
1024
|
+
album = db.add_album("album 3", artist=artist.ID)
|
1025
|
+
assert album.AlbumArtistID == artist.ID
|
1026
|
+
|
1027
|
+
|
1028
|
+
def test_add_artist(db):
|
1029
|
+
old_usn = db.get_local_usn()
|
1030
|
+
name = "test"
|
1031
|
+
db.add_artist(name)
|
1032
|
+
db.commit()
|
1033
|
+
|
1034
|
+
# Check that album was created and USN is incremented
|
1035
|
+
instance = db.get_artist(Name=name).one()
|
1036
|
+
assert instance.Name == name
|
1037
|
+
assert instance.rb_local_usn == old_usn + 1
|
1038
|
+
assert db.get_local_usn() == old_usn + 1
|
1039
|
+
|
1040
|
+
# Fail if album with same name is added
|
1041
|
+
with pytest.raises(ValueError):
|
1042
|
+
db.add_artist(name)
|
1043
|
+
|
1044
|
+
|
1045
|
+
def test_add_genre(db):
|
1046
|
+
old_usn = db.get_local_usn()
|
1047
|
+
name = "test"
|
1048
|
+
db.add_genre(name)
|
1049
|
+
db.commit()
|
1050
|
+
|
1051
|
+
# Check that album was created and USN is incremented
|
1052
|
+
instance = db.get_genre(Name=name).one()
|
1053
|
+
assert instance.Name == name
|
1054
|
+
assert instance.rb_local_usn == old_usn + 1
|
1055
|
+
assert db.get_local_usn() == old_usn + 1
|
1056
|
+
|
1057
|
+
# Fail if album with same name is added
|
1058
|
+
with pytest.raises(ValueError):
|
1059
|
+
db.add_genre(name)
|
1060
|
+
|
1061
|
+
|
1062
|
+
def test_add_label(db):
|
1063
|
+
old_usn = db.get_local_usn()
|
1064
|
+
name = "test"
|
1065
|
+
db.add_label(name)
|
1066
|
+
db.commit()
|
1067
|
+
|
1068
|
+
# Check that album was created and USN is incremented
|
1069
|
+
instance = db.get_label(Name=name).one()
|
1070
|
+
assert instance.Name == name
|
1071
|
+
assert instance.rb_local_usn == old_usn + 1
|
1072
|
+
assert db.get_local_usn() == old_usn + 1
|
1073
|
+
|
1074
|
+
# Fail if album with same name is added
|
1075
|
+
with pytest.raises(ValueError):
|
1076
|
+
db.add_label(name)
|
1077
|
+
|
1078
|
+
|
984
1079
|
def test_get_anlz_paths():
|
985
1080
|
content = DB.get_content().first()
|
986
1081
|
|
@@ -1,29 +0,0 @@
|
|
1
|
-
pyrekordbox/__init__.py,sha256=a9rUhmohVNWukYspPYvzHIiYS65mq1PNvbvB3rVukF4,630
|
2
|
-
pyrekordbox/__main__.py,sha256=SgfuYFZbimoRlEVWfcbidkpkJHg21a--2y9QB5YOans,6594
|
3
|
-
pyrekordbox/_version.py,sha256=H-qsvrxCpdhaQzyddR-yajEqI71hPxLa4KxzpP3uS1g,411
|
4
|
-
pyrekordbox/config.py,sha256=YwFYOMQMGj7iizQUbEXXoVi48mGIjzTCiyyOsQuuMbI,19636
|
5
|
-
pyrekordbox/logger.py,sha256=qCY_3L_3WIMAvNmVKvh7oshGlWrd0T5aIW1bNCIu3Lo,521
|
6
|
-
pyrekordbox/utils.py,sha256=-fXDNrHq33GU_4VykSlIMRz1s9d15pvdgsWyO6P216w,4357
|
7
|
-
pyrekordbox/xml.py,sha256=0qsKc8SQa54URwWGt6oHTOHBiAQU2S8MbSxDbzKUB7A,38369
|
8
|
-
pyrekordbox/anlz/__init__.py,sha256=OSpyl3pmmnt3mG905J9qvNnYchsgrIfathw0QXoOhjo,3156
|
9
|
-
pyrekordbox/anlz/file.py,sha256=ns63xok1FFk-tVGkX_sGeTtLkoE63mMpGpBbJqjBqAE,5188
|
10
|
-
pyrekordbox/anlz/structs.py,sha256=eKQusN4Zjj_K4UUCgEJXIAsJJsCA8-xRGMcsq6rd0iw,7987
|
11
|
-
pyrekordbox/anlz/tags.py,sha256=uqneBP9CstYy7a4IpeEC9A5tfI59DQm0ik7yFXk_dNo,14094
|
12
|
-
pyrekordbox/db6/__init__.py,sha256=5XbfEIZuribNXIHMn9M4qw91cKHouH82PPJbmODhdgo,849
|
13
|
-
pyrekordbox/db6/aux_files.py,sha256=t0SfMCXBHjlCSfgRfpw1RTj0cmV0QY07xSLepjQqMnY,7591
|
14
|
-
pyrekordbox/db6/database.py,sha256=d-Z6IqU3T2f5twOHoCWK_LEhbBdeVUC__Ejt7lYwE-E,66308
|
15
|
-
pyrekordbox/db6/registry.py,sha256=qSRk3hWVqYSdqPTBw_pzoKlKSoNd9pHjaqGaAt8zr2M,8940
|
16
|
-
pyrekordbox/db6/tables.py,sha256=HmgV-7B4BnZoA9Reu9cU3_5INz3Y-tljcPy-2t89ebA,56383
|
17
|
-
pyrekordbox/mysettings/__init__.py,sha256=rMS6Kknf1-X3PXF_TUxm8xui0H1Ap3R7G_9mqlnQUAM,705
|
18
|
-
pyrekordbox/mysettings/file.py,sha256=AGD4pho0E-i71UuFJbfehljqjlC9RSHsijjWCiyaCDI,13262
|
19
|
-
pyrekordbox/mysettings/structs.py,sha256=5Y1F3qTmsP1fRB39_BEHpQVxKx2DO9BytEuJUG_RNcY,8472
|
20
|
-
tests/__init__.py,sha256=s321RtRiHJsLt0YFq0NRncW7u66uwYHQE-6IjPcg10o,67
|
21
|
-
tests/test_anlz.py,sha256=hZAW5GFEJpU8UmmHYLuU5OZlApGrWZyPAR79KtaR0cw,5782
|
22
|
-
tests/test_db6.py,sha256=LGcVb7OedLN2UBclKSflp--7u0F9XTY_nuBWRP9J2G4,34799
|
23
|
-
tests/test_mysetting.py,sha256=te6B_BErGc6ThgBpAl45n0Nd0hWJcm-X9WTw14bR6MA,5781
|
24
|
-
tests/test_xml.py,sha256=CbdzWgVjLwmxdaUqLo58QN4iRRaUdiJe_ni8y37BVfQ,16852
|
25
|
-
pyrekordbox-0.2.0.dist-info/LICENSE,sha256=Au8sngdQ79q5JsZXZJVU13j46VDxFbPwC4x6sSz8Jes,1074
|
26
|
-
pyrekordbox-0.2.0.dist-info/METADATA,sha256=gmTOQiTyz3jEcyDJ-6ZclXFQw7veSGmLRPAQd0HxKJI,15296
|
27
|
-
pyrekordbox-0.2.0.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
28
|
-
pyrekordbox-0.2.0.dist-info/top_level.txt,sha256=o27yRnMFSCfS7GlJ7LHB4slxcROvsF5285xGW6PZykY,18
|
29
|
-
pyrekordbox-0.2.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|