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.
Files changed (83) hide show
  1. pyrekordbox/__init__.py +8 -8
  2. pyrekordbox/__main__.py +3 -2
  3. pyrekordbox/_version.py +2 -2
  4. pyrekordbox/anlz/__init__.py +3 -2
  5. pyrekordbox/anlz/file.py +4 -2
  6. pyrekordbox/anlz/tags.py +3 -1
  7. pyrekordbox/config.py +79 -23
  8. pyrekordbox/db6/__init__.py +2 -2
  9. pyrekordbox/db6/aux_files.py +3 -2
  10. pyrekordbox/db6/database.py +101 -111
  11. pyrekordbox/db6/registry.py +1 -0
  12. pyrekordbox/db6/smartlist.py +7 -6
  13. pyrekordbox/db6/tables.py +44 -16
  14. pyrekordbox/logger.py +0 -1
  15. pyrekordbox/mysettings/__init__.py +5 -4
  16. pyrekordbox/mysettings/file.py +3 -1
  17. pyrekordbox/rbxml.py +5 -3
  18. pyrekordbox/utils.py +4 -3
  19. {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/METADATA +21 -41
  20. pyrekordbox-0.4.0.dist-info/RECORD +25 -0
  21. {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/WHEEL +1 -1
  22. {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/top_level.txt +0 -2
  23. docs/Makefile +0 -20
  24. docs/make.bat +0 -35
  25. docs/source/_static/images/anlz_beat.svg +0 -53
  26. docs/source/_static/images/anlz_file.svg +0 -204
  27. docs/source/_static/images/anlz_pco2.svg +0 -138
  28. docs/source/_static/images/anlz_pcob.svg +0 -148
  29. docs/source/_static/images/anlz_pcp2.svg +0 -398
  30. docs/source/_static/images/anlz_pcpt.svg +0 -263
  31. docs/source/_static/images/anlz_ppth.svg +0 -123
  32. docs/source/_static/images/anlz_pqt2.svg +0 -324
  33. docs/source/_static/images/anlz_pqt2_2.svg +0 -253
  34. docs/source/_static/images/anlz_pqtz.svg +0 -140
  35. docs/source/_static/images/anlz_pssi.svg +0 -192
  36. docs/source/_static/images/anlz_pssi_entry.svg +0 -191
  37. docs/source/_static/images/anlz_pvbr.svg +0 -125
  38. docs/source/_static/images/anlz_pwav.svg +0 -130
  39. docs/source/_static/images/anlz_pwv3.svg +0 -139
  40. docs/source/_static/images/anlz_pwv4.svg +0 -139
  41. docs/source/_static/images/anlz_pwv5.svg +0 -139
  42. docs/source/_static/images/anlz_pwv5_entry.svg +0 -100
  43. docs/source/_static/images/anlz_pwv6.svg +0 -130
  44. docs/source/_static/images/anlz_pwv7.svg +0 -139
  45. docs/source/_static/images/anlz_pwvc.svg +0 -125
  46. docs/source/_static/images/anlz_tag.svg +0 -110
  47. docs/source/_static/images/x64dbg_rb_key.png +0 -0
  48. docs/source/_static/logos/dark/logo_primary.svg +0 -75
  49. docs/source/_static/logos/light/logo_primary.svg +0 -75
  50. docs/source/_static/logos/mid/logo_primary.svg +0 -75
  51. docs/source/_templates/apidoc/module.rst_t +0 -8
  52. docs/source/_templates/apidoc/package.rst_t +0 -57
  53. docs/source/_templates/apidoc/toc.rst_t +0 -7
  54. docs/source/_templates/autosummary/class.rst +0 -32
  55. docs/source/_templates/autosummary/module.rst +0 -55
  56. docs/source/api.md +0 -18
  57. docs/source/conf.py +0 -178
  58. docs/source/development/changes.md +0 -3
  59. docs/source/development/contributing.md +0 -3
  60. docs/source/formats/anlz.md +0 -634
  61. docs/source/formats/db6.md +0 -1233
  62. docs/source/formats/mysetting.md +0 -392
  63. docs/source/formats/xml.md +0 -376
  64. docs/source/index.md +0 -103
  65. docs/source/installation.md +0 -271
  66. docs/source/key.md +0 -103
  67. docs/source/quickstart.md +0 -189
  68. docs/source/requirements.txt +0 -7
  69. docs/source/tutorial/anlz.md +0 -7
  70. docs/source/tutorial/configuration.md +0 -66
  71. docs/source/tutorial/db6.md +0 -178
  72. docs/source/tutorial/index.md +0 -20
  73. docs/source/tutorial/mysetting.md +0 -124
  74. docs/source/tutorial/xml.md +0 -140
  75. pyrekordbox/xml.py +0 -8
  76. pyrekordbox-0.3.2.dist-info/RECORD +0 -84
  77. tests/__init__.py +0 -3
  78. tests/test_anlz.py +0 -206
  79. tests/test_config.py +0 -175
  80. tests/test_db6.py +0 -1193
  81. tests/test_mysetting.py +0 -203
  82. tests/test_xml.py +0 -629
  83. {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 sqlalchemy import Column, Integer, VARCHAR, BigInteger, SmallInteger, Text, Float
13
- from sqlalchemy import ForeignKey, TypeDecorator
14
- from sqlalchemy.orm import DeclarativeBase, relationship, backref, mapped_column, Mapped
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 tzinfo == "+00:00", tzinfo
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
- insp = inspect(self.__class__)
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
@@ -20,4 +20,3 @@ logger.addHandler(sh)
20
20
 
21
21
  # Set logging level
22
22
  logger.setLevel(logging.WARNING)
23
- logging.root.setLevel(logging.NOTSET)
@@ -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$")
@@ -5,8 +5,10 @@
5
5
  """Rekordbox My-Setting file handlers."""
6
6
 
7
7
  import re
8
- from construct import Struct
9
8
  from collections.abc import MutableMapping
9
+
10
+ from construct import Struct
11
+
10
12
  from . import structs
11
13
 
12
14
  # fmt: off
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
- import xml.etree.cElementTree as xml
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
1
+ Metadata-Version: 2.2
2
2
  Name: pyrekordbox
3
- Version: 0.3.2
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 >=0.21.0
51
- Requires-Dist: blowfish >=0.6.0
52
- Requires-Dist: construct >=2.10.0
53
- Requires-Dist: numpy >=1.19.0
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 >=5.9.0
56
- Requires-Dist: sqlalchemy >=2.0.0
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 >=6.0.0 ; extra == 'test'
61
- Requires-Dist: pytest >=6.2.0 ; extra == 'test'
62
- Requires-Dist: pytest-cov ; extra == 'test'
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.5.3 | 6.7.7``
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
- For MacOS follow these steps:
123
-
124
- 1) Install [Homebrew](https://brew.sh) if you do not have it on your machine.
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 now uses a SQLite database for storing the collection content.
172
- Unfortunatly, the new `master.db` SQLite database is encrypted using
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/coleifer/sqlcipher3
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,3 +1 @@
1
- docs
2
1
  pyrekordbox
3
- tests
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>