pyrekordbox 0.3.2__py3-none-any.whl → 0.4.0__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.
- pyrekordbox/__init__.py +8 -8
- pyrekordbox/__main__.py +3 -2
- pyrekordbox/_version.py +2 -2
- pyrekordbox/anlz/__init__.py +3 -2
- pyrekordbox/anlz/file.py +4 -2
- pyrekordbox/anlz/tags.py +3 -1
- pyrekordbox/config.py +79 -23
- pyrekordbox/db6/__init__.py +2 -2
- pyrekordbox/db6/aux_files.py +3 -2
- pyrekordbox/db6/database.py +101 -111
- pyrekordbox/db6/registry.py +1 -0
- pyrekordbox/db6/smartlist.py +7 -6
- pyrekordbox/db6/tables.py +44 -16
- pyrekordbox/logger.py +0 -1
- pyrekordbox/mysettings/__init__.py +5 -4
- pyrekordbox/mysettings/file.py +3 -1
- pyrekordbox/rbxml.py +5 -3
- pyrekordbox/utils.py +4 -3
- {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/METADATA +21 -41
- pyrekordbox-0.4.0.dist-info/RECORD +25 -0
- {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/WHEEL +1 -1
- {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/top_level.txt +0 -2
- docs/Makefile +0 -20
- docs/make.bat +0 -35
- docs/source/_static/images/anlz_beat.svg +0 -53
- docs/source/_static/images/anlz_file.svg +0 -204
- docs/source/_static/images/anlz_pco2.svg +0 -138
- docs/source/_static/images/anlz_pcob.svg +0 -148
- docs/source/_static/images/anlz_pcp2.svg +0 -398
- docs/source/_static/images/anlz_pcpt.svg +0 -263
- docs/source/_static/images/anlz_ppth.svg +0 -123
- docs/source/_static/images/anlz_pqt2.svg +0 -324
- docs/source/_static/images/anlz_pqt2_2.svg +0 -253
- docs/source/_static/images/anlz_pqtz.svg +0 -140
- docs/source/_static/images/anlz_pssi.svg +0 -192
- docs/source/_static/images/anlz_pssi_entry.svg +0 -191
- docs/source/_static/images/anlz_pvbr.svg +0 -125
- docs/source/_static/images/anlz_pwav.svg +0 -130
- docs/source/_static/images/anlz_pwv3.svg +0 -139
- docs/source/_static/images/anlz_pwv4.svg +0 -139
- docs/source/_static/images/anlz_pwv5.svg +0 -139
- docs/source/_static/images/anlz_pwv5_entry.svg +0 -100
- docs/source/_static/images/anlz_pwv6.svg +0 -130
- docs/source/_static/images/anlz_pwv7.svg +0 -139
- docs/source/_static/images/anlz_pwvc.svg +0 -125
- docs/source/_static/images/anlz_tag.svg +0 -110
- docs/source/_static/images/x64dbg_rb_key.png +0 -0
- docs/source/_static/logos/dark/logo_primary.svg +0 -75
- docs/source/_static/logos/light/logo_primary.svg +0 -75
- docs/source/_static/logos/mid/logo_primary.svg +0 -75
- docs/source/_templates/apidoc/module.rst_t +0 -8
- docs/source/_templates/apidoc/package.rst_t +0 -57
- docs/source/_templates/apidoc/toc.rst_t +0 -7
- docs/source/_templates/autosummary/class.rst +0 -32
- docs/source/_templates/autosummary/module.rst +0 -55
- docs/source/api.md +0 -18
- docs/source/conf.py +0 -178
- docs/source/development/changes.md +0 -3
- docs/source/development/contributing.md +0 -3
- docs/source/formats/anlz.md +0 -634
- docs/source/formats/db6.md +0 -1233
- docs/source/formats/mysetting.md +0 -392
- docs/source/formats/xml.md +0 -376
- docs/source/index.md +0 -103
- docs/source/installation.md +0 -271
- docs/source/key.md +0 -103
- docs/source/quickstart.md +0 -189
- docs/source/requirements.txt +0 -7
- docs/source/tutorial/anlz.md +0 -7
- docs/source/tutorial/configuration.md +0 -66
- docs/source/tutorial/db6.md +0 -178
- docs/source/tutorial/index.md +0 -20
- docs/source/tutorial/mysetting.md +0 -124
- docs/source/tutorial/xml.md +0 -140
- pyrekordbox/xml.py +0 -8
- pyrekordbox-0.3.2.dist-info/RECORD +0 -84
- tests/__init__.py +0 -3
- tests/test_anlz.py +0 -206
- tests/test_config.py +0 -175
- tests/test_db6.py +0 -1193
- tests/test_mysetting.py +0 -203
- tests/test_xml.py +0 -629
- {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/LICENSE +0 -0
pyrekordbox/db6/tables.py
CHANGED
@@ -5,15 +5,28 @@
|
|
5
5
|
"""Rekordbox 6 `master.db` SQLAlchemy table declarations."""
|
6
6
|
|
7
7
|
import math
|
8
|
+
import re
|
8
9
|
import struct
|
9
|
-
import numpy as np
|
10
|
-
from enum import IntEnum
|
11
10
|
from datetime import datetime
|
12
|
-
from
|
13
|
-
from
|
14
|
-
|
11
|
+
from enum import IntEnum
|
12
|
+
from typing import List
|
13
|
+
|
14
|
+
import numpy as np
|
15
|
+
from sqlalchemy import (
|
16
|
+
VARCHAR,
|
17
|
+
BigInteger,
|
18
|
+
Column,
|
19
|
+
Float,
|
20
|
+
ForeignKey,
|
21
|
+
Integer,
|
22
|
+
SmallInteger,
|
23
|
+
Text,
|
24
|
+
TypeDecorator,
|
25
|
+
)
|
15
26
|
from sqlalchemy.ext.associationproxy import association_proxy
|
16
27
|
from sqlalchemy.inspection import inspect
|
28
|
+
from sqlalchemy.orm import DeclarativeBase, Mapped, backref, mapped_column, relationship
|
29
|
+
|
17
30
|
from .registry import RekordboxAgentRegistry
|
18
31
|
|
19
32
|
__all__ = [
|
@@ -106,7 +119,6 @@ class DateTime(TypeDecorator):
|
|
106
119
|
"""Custom datetime column with timezone support.
|
107
120
|
|
108
121
|
The datetime format in the database is `YYYY-MM-DD HH:MM:SS.SSS +00:00`.
|
109
|
-
The timezone seems to always be `+00:00` (UTC).
|
110
122
|
This format is not supported by the `DateTime` column of SQLAlchemy 2.
|
111
123
|
"""
|
112
124
|
|
@@ -125,7 +137,7 @@ class DateTime(TypeDecorator):
|
|
125
137
|
datestr, tzinfo = value[:23], value[23:]
|
126
138
|
datestr = datestr.strip()
|
127
139
|
tzinfo = tzinfo.strip()
|
128
|
-
assert
|
140
|
+
assert re.match(r"^\+\d{2}:\d{2}$", tzinfo)
|
129
141
|
else:
|
130
142
|
datestr, tzinfo = value, ""
|
131
143
|
dt = datetime.fromisoformat(datestr)
|
@@ -139,6 +151,15 @@ class PlaylistType(IntEnum):
|
|
139
151
|
SMART_PLAYLIST = 4
|
140
152
|
|
141
153
|
|
154
|
+
class FileType(IntEnum):
|
155
|
+
MP3 = 1
|
156
|
+
M4A = 4
|
157
|
+
FLAC = 5
|
158
|
+
WAV = 11
|
159
|
+
AIFF = 12
|
160
|
+
AIF = 12
|
161
|
+
|
162
|
+
|
142
163
|
# -- Base- and Mixin classes -----------------------------------------------------------
|
143
164
|
|
144
165
|
|
@@ -146,6 +167,7 @@ class Base(DeclarativeBase):
|
|
146
167
|
"""Base class used to initialize the declarative base for all tables."""
|
147
168
|
|
148
169
|
__tablename__: str
|
170
|
+
__keys__: List[str] = []
|
149
171
|
|
150
172
|
@classmethod
|
151
173
|
def create(cls, **kwargs):
|
@@ -164,13 +186,23 @@ class Base(DeclarativeBase):
|
|
164
186
|
"""Returns a list of all relationship names."""
|
165
187
|
return [column.key for column in inspect(cls).relationships] # noqa
|
166
188
|
|
189
|
+
@classmethod
|
190
|
+
def __get_keys__(cls):
|
191
|
+
"""Get all attributes of the table."""
|
192
|
+
items = cls.__dict__.items()
|
193
|
+
keys = [k for k, v in items if not callable(v) and not k.startswith("_")]
|
194
|
+
return keys
|
195
|
+
|
196
|
+
@classmethod
|
197
|
+
def keys(cls):
|
198
|
+
"""Returns a list of all column names including the relationships."""
|
199
|
+
if not cls.__keys__: # Cache the keys
|
200
|
+
cls.__keys__ = cls.__get_keys__()
|
201
|
+
return cls.__keys__
|
202
|
+
|
167
203
|
def __iter__(self):
|
168
204
|
"""Iterates over all columns and relationship names."""
|
169
|
-
|
170
|
-
for column in insp.c:
|
171
|
-
yield column.name
|
172
|
-
for column in insp.relationships: # noqa
|
173
|
-
yield column.key
|
205
|
+
return iter(self.keys())
|
174
206
|
|
175
207
|
def __len__(self):
|
176
208
|
return sum(1 for _ in self.__iter__())
|
@@ -184,10 +216,6 @@ class Base(DeclarativeBase):
|
|
184
216
|
RekordboxAgentRegistry.on_update(self, key, value)
|
185
217
|
super().__setattr__(key, value)
|
186
218
|
|
187
|
-
def keys(self):
|
188
|
-
"""Returns a list of all column names including the relationships."""
|
189
|
-
return list(self.__iter__())
|
190
|
-
|
191
219
|
def values(self):
|
192
220
|
"""Returns a list of all column values including the relationships."""
|
193
221
|
return [self.__getitem__(key) for key in self.keys()]
|
pyrekordbox/logger.py
CHANGED
@@ -4,14 +4,15 @@
|
|
4
4
|
|
5
5
|
import re
|
6
6
|
from pathlib import Path
|
7
|
+
|
7
8
|
from . import structs
|
8
9
|
from .file import (
|
9
10
|
FILES,
|
10
|
-
SettingsFile,
|
11
|
-
MySettingFile,
|
12
|
-
MySetting2File,
|
13
|
-
DjmMySettingFile,
|
14
11
|
DevSettingFile,
|
12
|
+
DjmMySettingFile,
|
13
|
+
MySetting2File,
|
14
|
+
MySettingFile,
|
15
|
+
SettingsFile,
|
15
16
|
)
|
16
17
|
|
17
18
|
RE_MYSETTING = re.compile(".*SETTING[0-9]?.DAT$")
|
pyrekordbox/mysettings/file.py
CHANGED
pyrekordbox/rbxml.py
CHANGED
@@ -7,10 +7,12 @@ r"""Rekordbox XML database file handler."""
|
|
7
7
|
import logging
|
8
8
|
import os.path
|
9
9
|
import urllib.parse
|
10
|
+
import xml.etree.cElementTree as xml
|
10
11
|
from abc import abstractmethod
|
11
12
|
from collections import abc
|
12
|
-
|
13
|
+
|
13
14
|
import bidict
|
15
|
+
|
14
16
|
from .utils import pretty_xml
|
15
17
|
|
16
18
|
logger = logging.getLogger(__name__)
|
@@ -658,7 +660,7 @@ class Node:
|
|
658
660
|
|
659
661
|
@property
|
660
662
|
def key_type(self):
|
661
|
-
"""str: The type of key used by the playlist node"""
|
663
|
+
"""str: The type of key used by the playlist node."""
|
662
664
|
return NODE_KEYTYPE_MAPPING.get(self._element.attrib.get("KeyType"))
|
663
665
|
|
664
666
|
@property
|
@@ -1280,7 +1282,7 @@ class RekordboxXml:
|
|
1280
1282
|
The default is 3 spaces.
|
1281
1283
|
"""
|
1282
1284
|
string = self.tostring(indent)
|
1283
|
-
with open(path, "w") as fh:
|
1285
|
+
with open(path, "w", encoding="utf-8") as fh:
|
1284
1286
|
fh.write(string)
|
1285
1287
|
|
1286
1288
|
def __repr__(self):
|
pyrekordbox/utils.py
CHANGED
@@ -6,9 +6,10 @@
|
|
6
6
|
|
7
7
|
import os
|
8
8
|
import warnings
|
9
|
-
import psutil
|
10
|
-
from xml.dom import minidom
|
11
9
|
import xml.etree.cElementTree as xml
|
10
|
+
from xml.dom import minidom
|
11
|
+
|
12
|
+
import psutil
|
12
13
|
|
13
14
|
warnings.simplefilter("always", DeprecationWarning)
|
14
15
|
|
@@ -122,7 +123,7 @@ def get_rekordbox_agent_pid(raise_exec=False):
|
|
122
123
|
|
123
124
|
|
124
125
|
def pretty_xml(element, indent=None, encoding="utf-8"):
|
125
|
-
"""Generates a formatted string of an XML element.
|
126
|
+
r"""Generates a formatted string of an XML element.
|
126
127
|
|
127
128
|
Parameters
|
128
129
|
----------
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.2
|
2
2
|
Name: pyrekordbox
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.4.0
|
4
4
|
Summary: Inofficial Python package for interacting with the library of Pioneers Rekordbox DJ software.
|
5
5
|
Author-email: Dylan Jones <dylanljones94@gmail.com>
|
6
6
|
License: MIT License
|
@@ -47,19 +47,20 @@ Classifier: Topic :: Multimedia :: Sound/Audio
|
|
47
47
|
Requires-Python: >=3.8
|
48
48
|
Description-Content-Type: text/markdown
|
49
49
|
License-File: LICENSE
|
50
|
-
Requires-Dist: bidict
|
51
|
-
Requires-Dist: blowfish
|
52
|
-
Requires-Dist: construct
|
53
|
-
Requires-Dist: numpy
|
50
|
+
Requires-Dist: bidict>=0.21.0
|
51
|
+
Requires-Dist: blowfish>=0.6.0
|
52
|
+
Requires-Dist: construct>=2.10.0
|
53
|
+
Requires-Dist: numpy>=1.19.0
|
54
54
|
Requires-Dist: packaging
|
55
|
-
Requires-Dist: psutil
|
56
|
-
Requires-Dist: sqlalchemy
|
55
|
+
Requires-Dist: psutil>=5.9.0
|
56
|
+
Requires-Dist: sqlalchemy>=2.0.0
|
57
|
+
Requires-Dist: sqlcipher3-wheels
|
57
58
|
Requires-Dist: frida-tools
|
58
59
|
Requires-Dist: python-dateutil
|
59
60
|
Provides-Extra: test
|
60
|
-
Requires-Dist: hypothesis
|
61
|
-
Requires-Dist: pytest
|
62
|
-
Requires-Dist: pytest-cov
|
61
|
+
Requires-Dist: hypothesis>=6.0.0; extra == "test"
|
62
|
+
Requires-Dist: pytest>=6.2.0; extra == "test"
|
63
|
+
Requires-Dist: pytest-cov; extra == "test"
|
63
64
|
|
64
65
|
|
65
66
|
<p align="center">
|
@@ -85,7 +86,7 @@ Pioneers Rekordbox DJ Software. It currently supports
|
|
85
86
|
- Analysis files (ANLZ)
|
86
87
|
- My-Setting files
|
87
88
|
|
88
|
-
Tested Rekordbox versions: ``5.8.6 | 6.
|
89
|
+
Tested Rekordbox versions: ``5.8.6 | 6.7.7 | 7.0.9``
|
89
90
|
|
90
91
|
|
91
92
|
|⚠️| This project is still under development and might contain bugs or have breaking API changes in the future. Check the [changelog][CHANGELOG] for recent changes! |
|
@@ -107,32 +108,10 @@ where `VERSION` is a release, tag or branch name.
|
|
107
108
|
|
108
109
|
### Dependencies
|
109
110
|
|
110
|
-
Unlocking the new Rekordbox 6 `master.db` database file requires [SQLCipher][sqlcipher].
|
111
|
-
Pyrekordbox makes no attempt to download/install SQLCipher, as it is a
|
112
|
-
pure Python package - whereas the SQLCipher/sqlcipher3 installation is
|
113
|
-
platform-dependent and can not be installed via ``pip``.
|
114
|
-
|
115
|
-
#### Windows
|
116
|
-
|
117
|
-
SQLCipher can be used by building the libary against an amalgamation with [sqlcipher3].
|
118
|
-
For a detailed instruction, see the [installation guide][installation].
|
119
|
-
|
120
|
-
#### MacOS
|
121
111
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
2) Install SQLCipher with `brew install SQLCipher`.
|
126
|
-
3) With the python environment you are using to run pyrekordbox active execute the following:
|
127
|
-
```shell
|
128
|
-
git clone https://github.com/coleifer/sqlcipher3
|
129
|
-
cd sqlcipher3
|
130
|
-
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
|
131
|
-
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
|
132
|
-
```
|
133
|
-
Make sure the `C_INCLUDE` and `LIBRARY_PATH` point to the installed SQLCipher path. It may differ on your machine.
|
134
|
-
If you are having issues installing [sqlcipher3] on M1 Macs please refer to the
|
135
|
-
[installation guide][installation].
|
112
|
+
Unlocking the new Rekordbox 6 `master.db` database file requires [SQLCipher][sqlcipher].
|
113
|
+
Pyrekordbox tries to install pre-built wheels with included sqlcipher binaries via the [sqlcipher3-wheels] package.
|
114
|
+
If this fails, it can be installed manually following the [installation guide][installation].
|
136
115
|
|
137
116
|
|
138
117
|
## 🚀 Quick-Start
|
@@ -166,10 +145,10 @@ Alternatively the two paths can be specified in a configuration file under the s
|
|
166
145
|
pyrekordbox.cfg and pyrekordbox.yaml.
|
167
146
|
|
168
147
|
|
169
|
-
### Rekordbox 6 database
|
148
|
+
### Rekordbox 6/7 database
|
170
149
|
|
171
|
-
Rekordbox 6
|
172
|
-
Unfortunatly, the
|
150
|
+
Rekordbox 6 and 7 use a SQLite database for storing the collection content.
|
151
|
+
Unfortunatly, the `master.db` SQLite database is encrypted using
|
173
152
|
[SQLCipher][sqlcipher], which means it can't be used without the encryption key.
|
174
153
|
However, since your data is stored and used locally, the key must be present on the
|
175
154
|
machine running Rekordbox.
|
@@ -199,6 +178,7 @@ content.Title = "New Title"
|
|
199
178
|
Some fields are stored as references to other tables, for example the artist of a track.
|
200
179
|
Check the [documentation][db6-doc] of the corresponding object for more information.
|
201
180
|
So far only a few tables support adding or deleting entries:
|
181
|
+
- ``DjmdContent``: Tracks
|
202
182
|
- ``DjmdPlaylist``: Playlists/Playlist Folders
|
203
183
|
- ``DjmdSongPlaylist``: Songs in a playlist
|
204
184
|
- ``DjmdAlbum``: Albums
|
@@ -388,7 +368,7 @@ the CI setup since it requires a working Rekordbox installation.
|
|
388
368
|
|
389
369
|
[repo]: https://github.com/dylanljones/pyrekordbox
|
390
370
|
[sqlcipher]: https://www.zetetic.net/sqlcipher/open-source/
|
391
|
-
[sqlcipher3]: https://github.com/
|
371
|
+
[sqlcipher3-wheels]: https://github.com/laggykiller/sqlcipher3
|
392
372
|
[rekordcrate]: https://github.com/Holzhaus/rekordcrate
|
393
373
|
[crate-digger]: https://github.com/Deep-Symmetry/crate-digger
|
394
374
|
[supbox]: https://github.com/gabek/supbox
|
@@ -0,0 +1,25 @@
|
|
1
|
+
pyrekordbox/__init__.py,sha256=hvg2dB7qhgGB6SmcRg8AION6mTGdlsThdHhsDZ9WYfs,622
|
2
|
+
pyrekordbox/__main__.py,sha256=BtyDwVSGyoURY9Cy004vRL5Tgkwt4F7eXX_GD_vVYNQ,5976
|
3
|
+
pyrekordbox/_version.py,sha256=j90u3VVU4UrJf1fgMUhaZarHK_Do2XGYXr-vZvOFzVo,411
|
4
|
+
pyrekordbox/config.py,sha256=_mbzXaykU184XB2hxIBkFu0jlfmen1FKjufMrsZW7o8,27314
|
5
|
+
pyrekordbox/logger.py,sha256=dq1BtXBGavuAjuc45mvjF6mOWaeZqZFzo2aBOJdJ0Ik,483
|
6
|
+
pyrekordbox/rbxml.py,sha256=IfFjpuzcuX5pMs7eZEuC5GDA1dXE-BgkPz9EIQmQRhU,38390
|
7
|
+
pyrekordbox/utils.py,sha256=hkYIgG5U4rzl2tjN9ESzLnf8OysEFybRQgmr6J7xq-k,4363
|
8
|
+
pyrekordbox/anlz/__init__.py,sha256=SEVY0oPX9ohCVViUbsoOLTrBrFewTh-61qJxwXgAJKg,3155
|
9
|
+
pyrekordbox/anlz/file.py,sha256=F6axHmprnp0j3pZkqmmp5iiJBUpqtWiAhSzlAJp2H6Y,6951
|
10
|
+
pyrekordbox/anlz/structs.py,sha256=Lt4fkb3SAE8w146eWeWGnpgRoP6jhLMWrSMoMwPjG04,7925
|
11
|
+
pyrekordbox/anlz/tags.py,sha256=2JfideIkjzAnxXwSPWCi-Nb3t6waUszv_nGd6AJQZYM,14097
|
12
|
+
pyrekordbox/db6/__init__.py,sha256=TZX_BPGZIkc4zSTULIc8yd_bf91MAezGtZevKNh3kZ0,856
|
13
|
+
pyrekordbox/db6/aux_files.py,sha256=MehdQSc4iryiHvH8RfE9_9xMnD5qjRRDhTo0o0KRLw0,7592
|
14
|
+
pyrekordbox/db6/database.py,sha256=Qx_prD3wF8laH7gMoJpG-iLM6l3Y_1JMkW1CSrw34Og,80960
|
15
|
+
pyrekordbox/db6/registry.py,sha256=zYq_B7INM97de7vUTxqmA4N_P53loDkBkYdzdoeSnvY,9725
|
16
|
+
pyrekordbox/db6/smartlist.py,sha256=gmD8koOIrzAHEiqQ90EHmx7WWZMuhrx4FO8k3r-YXeA,12204
|
17
|
+
pyrekordbox/db6/tables.py,sha256=KDEqPVZ63VAyqUNBfBTqLp-xZ0RYLBcovs7iIUczt4M,68362
|
18
|
+
pyrekordbox/mysettings/__init__.py,sha256=6iLTQ1KIjuoq8Zt3thmkjqJSxrRVIi7BrQpxNcsQK04,706
|
19
|
+
pyrekordbox/mysettings/file.py,sha256=JBfVe3jsmah_mGJjyC20_EqJZyJ7ftcOcCkRDKcWgv0,12671
|
20
|
+
pyrekordbox/mysettings/structs.py,sha256=5Y1F3qTmsP1fRB39_BEHpQVxKx2DO9BytEuJUG_RNcY,8472
|
21
|
+
pyrekordbox-0.4.0.dist-info/LICENSE,sha256=VwG9ZgC2UZnI0gTezGz1qkcAZ7sknBUQ1M62Z2nht54,1074
|
22
|
+
pyrekordbox-0.4.0.dist-info/METADATA,sha256=u6RWvAqSJpF0rD2Rq7inisM4YKlhFG40stdSZuzAigk,15799
|
23
|
+
pyrekordbox-0.4.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
24
|
+
pyrekordbox-0.4.0.dist-info/top_level.txt,sha256=bUHkyxIHZDgSB6zhYnF1o4Yf1EQlTGGIkVRq9uEtsa4,12
|
25
|
+
pyrekordbox-0.4.0.dist-info/RECORD,,
|
docs/Makefile
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
# Minimal makefile for Sphinx documentation
|
2
|
-
#
|
3
|
-
|
4
|
-
# You can set these variables from the command line, and also
|
5
|
-
# from the environment for the first two.
|
6
|
-
SPHINXOPTS ?=
|
7
|
-
SPHINXBUILD ?= sphinx-build
|
8
|
-
SOURCEDIR = source
|
9
|
-
BUILDDIR = build
|
10
|
-
|
11
|
-
# Put it first so that "make" without argument is like "make help".
|
12
|
-
help:
|
13
|
-
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
14
|
-
|
15
|
-
.PHONY: help Makefile
|
16
|
-
|
17
|
-
# Catch-all target: route all unknown targets to Sphinx using the new
|
18
|
-
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
19
|
-
%: Makefile
|
20
|
-
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
docs/make.bat
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
@ECHO OFF
|
2
|
-
|
3
|
-
pushd %~dp0
|
4
|
-
|
5
|
-
REM Command file for Sphinx documentation
|
6
|
-
|
7
|
-
if "%SPHINXBUILD%" == "" (
|
8
|
-
set SPHINXBUILD=sphinx-build
|
9
|
-
)
|
10
|
-
set SOURCEDIR=source
|
11
|
-
set BUILDDIR=build
|
12
|
-
|
13
|
-
if "%1" == "" goto help
|
14
|
-
|
15
|
-
%SPHINXBUILD% >NUL 2>NUL
|
16
|
-
if errorlevel 9009 (
|
17
|
-
echo.
|
18
|
-
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
|
19
|
-
echo.installed, then set the SPHINXBUILD environment variable to point
|
20
|
-
echo.to the full path of the 'sphinx-build' executable. Alternatively you
|
21
|
-
echo.may add the Sphinx directory to PATH.
|
22
|
-
echo.
|
23
|
-
echo.If you don't have Sphinx installed, grab it from
|
24
|
-
echo.https://www.sphinx-doc.org/
|
25
|
-
exit /b 1
|
26
|
-
)
|
27
|
-
|
28
|
-
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
|
29
|
-
goto end
|
30
|
-
|
31
|
-
:help
|
32
|
-
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
|
33
|
-
|
34
|
-
:end
|
35
|
-
popd
|
@@ -1,53 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg"
|
2
|
-
version="1.0" width="322" height="46"
|
3
|
-
viewBox="0 0 322 46">
|
4
|
-
<text x="21" y="8" font-family="Courier New, monospace" font-size="11"
|
5
|
-
dominant-baseline="middle" text-anchor="middle">0
|
6
|
-
</text>
|
7
|
-
<text x="61" y="8" font-family="Courier New, monospace" font-size="11"
|
8
|
-
dominant-baseline="middle" text-anchor="middle">1
|
9
|
-
</text>
|
10
|
-
<text x="101" y="8" font-family="Courier New, monospace" font-size="11"
|
11
|
-
dominant-baseline="middle" text-anchor="middle">2
|
12
|
-
</text>
|
13
|
-
<text x="141" y="8" font-family="Courier New, monospace" font-size="11"
|
14
|
-
dominant-baseline="middle" text-anchor="middle">3
|
15
|
-
</text>
|
16
|
-
<text x="181" y="8" font-family="Courier New, monospace" font-size="11"
|
17
|
-
dominant-baseline="middle" text-anchor="middle">4
|
18
|
-
</text>
|
19
|
-
<text x="221" y="8" font-family="Courier New, monospace" font-size="11"
|
20
|
-
dominant-baseline="middle" text-anchor="middle">5
|
21
|
-
</text>
|
22
|
-
<text x="261" y="8" font-family="Courier New, monospace" font-size="11"
|
23
|
-
dominant-baseline="middle" text-anchor="middle">6
|
24
|
-
</text>
|
25
|
-
<text x="301" y="8" font-family="Courier New, monospace" font-size="11"
|
26
|
-
dominant-baseline="middle" text-anchor="middle">7
|
27
|
-
</text>
|
28
|
-
<line x1="1" y1="15" x2="81" y2="15" stroke="#000000" stroke-width="1"/>
|
29
|
-
<line x1="1" y1="45" x2="81" y2="45" stroke="#000000" stroke-width="1"/>
|
30
|
-
<line x1="81" y1="15" x2="81" y2="45" stroke="#000000" stroke-width="1"/>
|
31
|
-
<line x1="1" y1="15" x2="1" y2="45" stroke="#000000" stroke-width="1"/>
|
32
|
-
<text font-size="18" font-family="Palatino, Georgia, Times New Roman, serif"
|
33
|
-
font-style="italic" x="41" y="31" text-anchor="middle"
|
34
|
-
dominant-baseline="middle">b
|
35
|
-
<tspan font-size="70%" dy="0.5ex" dominant-baseline="middle">num</tspan>
|
36
|
-
</text>
|
37
|
-
<line x1="81" y1="15" x2="161" y2="15" stroke="#000000" stroke-width="1"/>
|
38
|
-
<line x1="81" y1="45" x2="161" y2="45" stroke="#000000" stroke-width="1"/>
|
39
|
-
<line x1="161" y1="15" x2="161" y2="45" stroke="#000000" stroke-width="1"/>
|
40
|
-
<line x1="81" y1="15" x2="81" y2="45" stroke="#000000" stroke-width="1"/>
|
41
|
-
<text font-size="18" font-family="Palatino, Georgia, Times New Roman, serif"
|
42
|
-
font-style="italic" x="121" y="31" text-anchor="middle"
|
43
|
-
dominant-baseline="middle">tempo
|
44
|
-
</text>
|
45
|
-
<line x1="161" y1="15" x2="321" y2="15" stroke="#000000" stroke-width="1"/>
|
46
|
-
<line x1="161" y1="45" x2="321" y2="45" stroke="#000000" stroke-width="1"/>
|
47
|
-
<line x1="321" y1="15" x2="321" y2="45" stroke="#000000" stroke-width="1"/>
|
48
|
-
<line x1="161" y1="15" x2="161" y2="45" stroke="#000000" stroke-width="1"/>
|
49
|
-
<text font-size="18" font-family="Palatino, Georgia, Times New Roman, serif"
|
50
|
-
font-style="italic" x="241" y="31" text-anchor="middle"
|
51
|
-
dominant-baseline="middle">time
|
52
|
-
</text>
|
53
|
-
</svg>
|