Pyrekordbox Versions Save

Inofficial Python package for interacting with the database and other files (XML, ANLZ, MySettings) of Pioneers Rekordbox DJ software

v0.3.2

4 months ago

What's Changed

This release fixes smart-playlist related bugs and improves the database table relationships.

New Features

  • db: Add method for creating smart playlists
    This will set the ID in the smart list to the newly created playlist ID before generating the XML string

Improvements/Bug Fixes

  • db: add missing UUID entries
    The UUID was not set when creating the following db entries:
    • album
    • artist
    • genre
    • label
  • db: add missing relationships in DjmdContent
    Linked tables and corresponding relationships:
    • DjmdCue: Cues
    • DjmdSongMyTag: MyTags
    • DjmdActiveCensor: ActiveCensors
    • DjmdMixerParam: MixerParams
  • db: add My-Tag names association to the DjmdContent table
    It is now possible to get a list of the corresponding My-tag names from the DjmdContent instance.
  • db: add album artist association to the DjmdAlbum and DjmdContent tables
    It is now possible to get the album artist instance or name directly from the DjmdContent instance.
  • db: fix smart list filter bugs (#110)

Documentation

  • db: fix Kind notes in DjmdCue table

Full Changelog: https://github.com/dylanljones/pyrekordbox/compare/v0.3.1...v0.3.2

v0.3.1

5 months ago

What's Changed

This release improves the Rekordbox v6 database key extraction and adds a new handler for smart playlists.

New Features

  • add method to return the contents of a playlist in the RBv6 db directly
    The database can now be queried directly for the contents contained in a playlist. This works for regular playlists as well as for smart playlists. The full DjmdContent instances of specific columns can be returned.
  • add RBv6 smart playlist handler
    Add a handler for the smart playlists of Rekordbox. The conditions are stored as an XML string. The smart playlist handler supports parsing and writing the XML string.
  • add DB key extraction method for newer Rekordbox versions (#97).
    The key can now also be extracted with newer Rekordbox versions. frida is used to inject code to intercept the key when the DB is opened.

Improvements/Bug Fixes

  • populate configuration just-in-time
    Previously the config was populated when importing pyrekordbox. Now the config is updated the first time it is used.
  • use association proxies in DjmdContent table
    This makes it possible to filter queries using these associations, for example DjmdContent.ArtistName
  • add Playlist type enums and attributes

Full Changelog: https://github.com/dylanljones/pyrekordbox/compare/0.3.0...v0.3.1

0.3.0

5 months ago

What's Changed

This release fixes bugs and imrpoves error handling.

Improvements/Bug Fixes

  • The bank field of PSSI ANLZ tag can also have a value of 0 (#108)
    This fixes an issue where the XOR mask was applied to un-garbled PSSI tags.
  • check if RBv6 db key seems valid (#105)
    Check the key if it is passed manually to the db handler and raise an exception if it doesn't look valid. Only the first few characters are checked.
  • also change OrgFolderPath and FileNameL in update_content_path (#104)
    There were columns missing in the update_content_path method. These changes make the file paths consistent. Thank you @ben-hearn-sb for the help!
  • rename the xml module to rbxml to prevent conflict with builtin.
    Note that the old module name xml is deprecated and will be removed in version 0.4.0.

Documentation

  • add Rekordbox6 database key extraction alternatives

Full Changelog: https://github.com/dylanljones/pyrekordbox/compare/0.2.3...0.3.0

0.2.3

6 months ago

What's Changed

Improvements/Bug Fixes

  • drop Python 3.7 support
    Python 3.7 reached its end of lifetime in June 2023.
  • raise ImportError if RBv6 db is locked and sqlcipher is not available
    Pyrekordbox falls back to sqlite3 if sqlcipher3 is not available. This can lead to errors if the RBv6 database is locked and the user does not have sqlcipher3 installed.
  • don't pass deleted RBv6 instance to USN callback
    This sometimes raised an ObjectDeletedError

New Contributors

Full Changelog: https://github.com/dylanljones/pyrekordbox/compare/0.2.2...0.2.3

0.2.2

7 months ago

What's Changed

New Features

  • add new albums to the RBv6 db
    New entries can now be added to the DjmdAlbum table.
  • add new genres to the RBv6 db
    New entries can now be added to the DjmdGenre table.
  • add new artists to the RBv6 db
    New entries can now be added to the DjmdArtist table.
  • add new labels to the RBv6 db
    New entries can now be added to the DjmdLabel table.
  • support renamed Rekordbox application directory
    The user can now specify the directory name of the Rekordbox application directory. This supports multiple Rekordbox installations of the same major version.

Improvements/Bug Fixes

  • don't raise error if key is in cache
    This fixes an issue when using the database handler for Rekordbox>6.6.5 with the cached key.
  • de-obfuscate PSSI tag data on exported ANLZ files
    The PSSI tag data of ANLZ files that rekordbox 6 exports is garbled with an XOR mask. If the first few known fields of the PSSI tag are not valid values this indicates a garbled tag and the data is de-obfuscated. Thank you @troyhacks for the de-obfuscation.
  • add disabled context manager to the RBv6 RekordboxAgentRegistry
  • only re-enable RBV6 USN tracking if it was enabled

Documentation

  • add missing documentation of the PSSI tag of ANLZ files
  • Fix typo in djmdCue table documentation
  • update quickstart documentation

New Contributors

Full Changelog: https://github.com/dylanljones/pyrekordbox/compare/0.2.1...0.2.2

0.2.1

7 months ago

What's New

This release migrates to SqlAlchemy 2.0 and fixes some bugs.

Improvements/Bug Fixes

  • migrate to SqlAlchemy 2.0
  • add getters/setters for the mixer gain/peak settings in the RBv6 db (#88).
    The gain and peak values are stored as high/low binary values. It is now possible to get or set the gain/peak as a simple decibel value. Thank you @gsuberland for the help!
  • automatically set updated_at of tables in the RBv6 db
    The updated_at column is automatically updated via onupdate if rows are modified. This only happens if the user did not set the column manually.
  • flush the RBv6 db changes before applying USN auto-increment.
    This allows the user to use before_flush events more easily without affecting the USN changes

BREAKING CHANGE

pyrekordbox now only supports sqlcipher3. pysqlcipher3 is no longer supported since it is not compatible with SqlAlchemy 2.0.

New Contributors

Full Changelog: https://github.com/dylanljones/pyrekordbox/compare/0.2.0...0.2.1

0.2.0

7 months ago

What's New

This release adds methods for updating playlists/playlist folders and their contents.

New Features

  • create or delete playlists/playlist folders in the RBv6 db
    It is now possible to create playlists or playlist folders with arbitrary seq number using the Rekordbox v6 database handler. Any playlist or playlist folder can also be deleted. All corresponding songs or sub-playlists will also be deleted.
  • add or remove tracks in RBv6 playlists
    It is now possible to add songs with arbitrary track number to playlists in the Rekordbox v6 database handler. Any song can also be removed from playlists. The track numbers of the other songs in the playlist get updated accordingly. To make sure all changes are compatible with Rekordbox, a new handler for the masterPlaylists6.xml auxiliary file was added.
  • move songs in playlists and playlists/playlists folders in the RBv6 db
    The track number of songs in playlists can now be updated. The track numbers of the other songs are updated accordingly. Playlists or playlist folders can also be rearranged or moved to a new parent folder.
  • add method for renaming playlists/playlist folders in the RBv6 db
    The update time and USN are updated accordingly.
  • add method for creating a decrypted copy of the RBv6 database (#86)

Improvements/Bug Fixes

  • generalize getters of list content tables in the RBv6 db
    This makes all getters consistent.
  • fix USN tracking and update times in playlist updates of the RBv6 db
  • prevent commits to the RBv6 db if Rekordbox is running
  • improve Parent relationship in nested tables.
    The Parent relationship in nested tables (like playlists) are now declared via backref. This fixes a bug when deleting rows.
  • set updated_at in the playlist XML when committing the RBv6 db

New Contributors

Full Changelog: https://github.com/dylanljones/pyrekordbox/compare/0.1.8...0.2.0

0.1.8

8 months ago

What's New

New Features

  • add methods for converting RBv6 tables to a dictionary
    This can be used to save the database contents to an open file format, for example JSON.

Improvements/Bug Fixes

  • add getters for the db_directory and share_directory to the RBv6 database handler
    This makes it easier to access the additional data of Rekordbox (ANLZ or artwork files).
  • improve columns method of RBv6 tables
    The columns method now returns the actual columns of the table (without relationships). To get a list of the column names with the relationships, use the keys method.
  • fix wrong ANLZ root directory in the RBv6 database handler
    The user can now also specify the ANLZ root directory if a database object is opened in an unusual location by supplying the db_dir argument.
  • cache XML track list to speed up checking for duplicates
    The TrackID and Location of each track element is cached to prevent checking each XML element when adding new tracks. In addition, the track count is now incremented/decremented when adding/removing tracks. This makes it much faster to add or remove elements in the XML track collection.
  • fix bug when adding tempo and position marks to XML track elements
    Adding new tempo of position marks was not possible due to the wrong object being passed as parent element.
  • warn when opening the database and Rekordbox is running

Documentation

  • bump furo version to fix RDT issue
  • remove sphinx_toggleprompt (incompatible with sphinx>=7)
  • Use RTD's new build process and config

Full Changelog: https://github.com/dylanljones/pyrekordbox/compare/0.1.7...0.1.8

0.1.7

9 months ago

What's New

This release attempts to add a workaround for the broken key extraction and fixes some bugs.

New Features

  • add CLI command to download and cache the RB6 db key from the web (#64)
    Pyrekordbox tries to download the key from projects that have hard-coded the key (see issue #77). If the download was successful it writes it to the cache file.

Improvements/Bug Fixes

  • add method for writing the RB6 db key cache manually (#64)
    If the extraction of the Rekordbox database key fails (>=6.6.5), the user can now write the key manually to the cache file. After updating the cache the database can be opened without providing the key as argument. To make this work pyrekordbox now caches the decrypted key, not the password for decrypting the key. If an old cache file is found it is upgraded automatically.
  • move install_sqlcipher.py script to CLI command
    The script is now available as pyrekordbox install-sqlcipher.
  • add missing relationships in the RB6 database table declarations
    Affected tables and corresponding relationships:
    • DjmdAlbum: AlbumArtist
    • DjmdCategory: MenuItem
    • DjmdCue: Content
    • DjmdSort: MenuItem
  • fix copy/paste error in date getter of the RekordboxAgentRegistry
    The get_date method was actually setting the value.

Documentation

  • add section for downloading or manually writing the RB6 db key cache
  • add basic docstrings to the RekordboxAgentRegistry object
  • add basic docstrings to the Rekordbox database tables

Full Changelog: https://github.com/dylanljones/pyrekordbox/compare/0.1.6...0.1.7

0.1.6

9 months ago

What's New

This release contains improvements of the handling of incompatible Rekordbox versions and improves the documentation.

Improvements/Bug Fixes

  • raise exception with hint when opening the RB6 database if the key extraction failed (#64)
  • cache pw extracted from the rekordbox app.asar file
    This speeds up the initialization of the package

Documentation

  • fix modified path in update filename example (#81)
  • add workaround for key extraction of the RBv6 database (#64)
  • migrate documentation to markdown
  • small fixes in documentation

Full Changelog: https://github.com/dylanljones/pyrekordbox/compare/0.1.5...0.1.6