XML Database#

We will use the Rekordbox 6 database from the test data as an example:

import os
path = os.path.join(".testdata", "rekordbox 5", "database.xml")

An existing XML database can be parsed by passing the file path to the RekordboxXml constructor:

from pyrekordbox import RekordboxXml
xml = RekordboxXml(path)
print(xml.tostring())

Printing the contents results in the following output:

<?xml version="1.0" encoding="utf-8"?>
<DJ_PLAYLISTS Version="1.0.0">
    <PRODUCT Name="rekordbox" Version="6.6.2" Company="AlphaTheta"/>
    <COLLECTION Entries="6">
        <TRACK TrackID="253529738" Name="Demo Track 1" Artist="Loopmasters" Composer="" Album="" Grouping="" Genre="" Kind="Mp3-Datei " Size="6899624" TotalTime="172" DiscNumber="0" TrackNumber="0" Year="0" AverageBpm="128.00" DateAdded="2022-04-09" BitRate="320" SampleRate="44100" Comments="Tracks by www.loopmasters.com" PlayCount="0" Rating="0" Location="file://localhost/C:/Music/PioneerDJ/Demo%20Tracks/Demo%20Track%201.mp3" Remixer="" Tonality="Fm" Label="Loopmasters" Mix="">
            <TEMPO Inizio="0.025" Bpm="128.00" Metro="4/4" Battito="1"/>
        </TRACK>
        <TRACK TrackID="17109519" Name="Demo Track 2" Artist="Loopmasters" Composer="" Album="" Grouping="" Genre="" Kind="Mp3-Datei " Size="5124342" TotalTime="128" DiscNumber="0" TrackNumber="0" Year="0" AverageBpm="120.00" DateAdded="2022-04-09" BitRate="320" SampleRate="44100" Comments="Tracks by www.loopmasters.com" PlayCount="0" Rating="0" Location="file://localhost/C:/Music/PioneerDJ/Demo%20Tracks/Demo%20Track%202.mp3" Remixer="" Tonality="Fm" Label="Loopmasters" Mix="">
            <TEMPO Inizio="0.025" Bpm="120.00" Metro="4/4" Battito="1"/>
            <TEMPO Inizio="48.026" Bpm="120.00" Metro="4/4" Battito="1"/>
            <TEMPO Inizio="48.525" Bpm="120.00" Metro="4/4" Battito="2"/>
            <TEMPO Inizio="49.026" Bpm="120.00" Metro="4/4" Battito="3"/>
            <TEMPO Inizio="49.525" Bpm="120.00" Metro="4/4" Battito="4"/>
            <TEMPO Inizio="50.026" Bpm="120.00" Metro="4/4" Battito="1"/>
            <TEMPO Inizio="50.525" Bpm="120.00" Metro="4/4" Battito="2"/>
            <TEMPO Inizio="51.026" Bpm="120.00" Metro="4/4" Battito="3"/>
            <TEMPO Inizio="51.525" Bpm="120.00" Metro="4/4" Battito="4"/>
            <TEMPO Inizio="52.026" Bpm="120.00" Metro="4/4" Battito="1"/>
        </TRACK>
        <TRACK TrackID="49557014" Name="HORN" Artist="" Composer="" Album="" Grouping="" Genre="" Kind="Wav-Datei " Size="2010816" TotalTime="7" DiscNumber="0" TrackNumber="0" Year="0" AverageBpm="0.00" DateAdded="2022-04-09" BitRate="2116" SampleRate="44100" Comments="" PlayCount="0" Rating="0" Location="file://localhost/C:/Music/PioneerDJ/Sampler/OSC_SAMPLER/PRESET%20ONESHOT/HORN.wav" Remixer="" Tonality="" Label="" Mix=""/>
        <TRACK TrackID="209873516" Name="NOISE" Artist="" Composer="" Album="" Grouping="" Genre="" Kind="Wav-Datei " Size="1382226" TotalTime="5" DiscNumber="0" TrackNumber="0" Year="0" AverageBpm="0.00" DateAdded="2022-04-09" BitRate="2116" SampleRate="44100" Comments="" PlayCount="0" Rating="0" Location="file://localhost/C:/Music/PioneerDJ/Sampler/OSC_SAMPLER/PRESET%20ONESHOT/NOISE.wav" Remixer="" Tonality="" Label="" Mix=""/>
        <TRACK TrackID="55231398" Name="SINEWAVE" Artist="" Composer="" Album="" Grouping="" Genre="" Kind="Wav-Datei " Size="1515258" TotalTime="5" DiscNumber="0" TrackNumber="0" Year="0" AverageBpm="0.00" DateAdded="2022-04-09" BitRate="2116" SampleRate="44100" Comments="" PlayCount="0" Rating="0" Location="file://localhost/C:/Music/PioneerDJ/Sampler/OSC_SAMPLER/PRESET%20ONESHOT/SINEWAVE.wav" Remixer="" Tonality="" Label="" Mix=""/>
        <TRACK TrackID="92396897" Name="SIREN" Artist="" Composer="" Album="" Grouping="" Genre="" Kind="Wav-Datei " Size="1941204" TotalTime="7" DiscNumber="0" TrackNumber="0" Year="0" AverageBpm="0.00" DateAdded="2022-04-09" BitRate="2116" SampleRate="44100" Comments="" PlayCount="0" Rating="0" Location="file://localhost/C:/Music/PioneerDJ/Sampler/OSC_SAMPLER/PRESET%20ONESHOT/SIREN.wav" Remixer="" Tonality="" Label="" Mix=""/>
    </COLLECTION>
    <PLAYLISTS>
        <NODE Type="0" Name="ROOT" Count="1">
            <NODE Name="Trial playlist - Cloud Library Sync" Type="1" KeyType="0" Entries="0"/>
        </NODE>
    </PLAYLISTS>
</DJ_PLAYLISTS>

Tracks#

Individual tracks in the collection can be fetched by supplying an index

>>> xml.get_track(0)
<Track(Location=C:\Music\PioneerDJ\Demo Tracks\Demo Track 1.mp3)>

or the TrackID:

>>> xml.get_track(TrackID=253529738)
<Track(Location=C:\Music\PioneerDJ\Demo Tracks\Demo Track 1.mp3)>

All items in the collection can be fetched via

>>> tracks = xml.get_tracks()
>>> tracks[0]
<Track(Location=C:\Music\PioneerDJ\Demo Tracks\Demo Track 1.mp3)>

The XML attributes of a Track element are accessable as an attribute of the Track object or via a dict-interface:

>>> track = xml.get_track(0)
>>> track.Name
Demo Track 1

>>> track["Name"]
Demo Track 1

Each track can contain a Tempo or PositionMark element. The Tempo element stores the beat grid information:

>>> track = xml.get_track(0)
>>> tempo = track.tempos[0]
>>> tempo.Bpm
128.0

and the PositionMark element stores the cue points of a track (not included in the XML example above):

>>> track = xml.get_track(0)
>>> mark = track.marks[0]
>>> mark.Type
cue

>>> mark.Start
0.0

>>> mark.Num
-1

See also

See the XML Database Format documentation for a list of valid attributes. All XML attributes start with a capital letter.

Playlists#

Playlists or playlist folders can be accessed by supplying the path:

folder = xml.get_playlist("Folder")
paylist = xml.get_playlist("Folder", "Sub Playlist")

Content in a playlist is stored as a key, which can either be the TrackID or the Location (file path):

>>> playlist.key_type
TrackID

The keys can be retrieved by calling

keys = playlist.get_tracks()

A new track can be added to a playlist by specifying the corresponding key:

playlist.add_track(track_key)

A new sub-folder or -playlist can be added by supplying the name:

folder.add_playlist("Playlist")
folder.add_playlist_folder("Folder")