This is a python script which should work on Linux for Exporting crates to
an XML format which it can use to later reconstruct said crates.
The format it uses for now is the following:
-----------------------------------------------
<mixxx-crates>
<mixxx-crate name="NAME">
<track artist=".." filename="..." location="..." title="..."/>
...
</mixxx-crate>
...
</mixxx-crates>
-----------------------------------------------
So far I have not researched the possibility of using a standard format.
Exporting playlists should be easy enough to do as well.
The program has online help, via the '-h' and '--help' options.
Enjoy! I hope someone can get some use out of it.
** WARNING ** this may or may not kill your cat, clog your drains or burn
down your house. No effort has been made to cause harm, but harm may arise.
There be dragons... maybe. Be warned.
#!/usr/bin/env python
#
# Import and Export Crates.
import sys
import os
import sqlite3
import xml.dom.minidom
from optparse import OptionParser
def ExportCrates(db, fp):
doc = xml.dom.minidom.Document()
cur = db.cursor()
cur.execute("SELECT * FROM crates")
crates = doc.createElement("mixxx-crates")
crates.setAttribute('version', '0.1')
doc.appendChild(crates)
row = cur.fetchone()
while row != None:
crate = doc.createElement('mixxx-crate')
crate.setAttribute('name', row['name'])
crates.appendChild(crate)
c2 = db.cursor()
c2.execute("""
SELECT
track_locations.location AS location,
track_locations.filename AS filename,
library.artist,
library.title
FROM library
INNER JOIN track_locations
ON (track_locations.id=library.location)
INNER JOIN crate_tracks
ON (crate_tracks.track_id=library.id)
WHERE
crate_tracks.crate_id = %d
""" % row['id'])
rt = c2.fetchone()
while rt != None:
try:
track = doc.createElement('track')
for key in rt.keys():
if rt[key] == None:
continue
track.setAttribute(key, rt[key])
except:
print "ERROR"
else:
crate.appendChild(track)
rt = c2.fetchone()
row = cur.fetchone()
fp.write(doc.toprettyxml("\t", "\n", "utf-8"))
def ImportCrates(db, crates):
doc = xml.dom.minidom.parse(crates)
crates = doc.getElementsByTagName('mixxx-crate')
for dcrate in crates:
crate = {}
crate['name'] = str(dcrate.getAttribute('name'))
try:
cur = db.cursor()
cur.execute("SELECT id FROM crates WHERE name = :name", crate)
cr = cur.fetchone()
crate['id'] = cr['id']
cur.close()
except Exception as e:
cur.execute("INSERT INTO crates ( name ) VALUES ( :name )", crate)
cur.execute("SELECT id FROM crates WHERE name = :name", crate)
cr = cur.fetchone()
crate['id'] = cr['id']
cur.close()
tracks = dcrate.getElementsByTagName('track')
for track in tracks:
trackAttr = {
'filename': None,
'location': None,
'artist': None,
'title': None
}
for key in trackAttr.keys():
if track.hasAttribute(key):
trackAttr[key] = track.getAttribute(key)
cur = db.cursor()
cur.execute("""
SELECT
library.id AS id
FROM library
INNER JOIN track_locations
ON (track_locations.id = library.location)
WHERE
track_locations.location = :location
OR track_locations.filename = :filename
OR (
:artist IS NOT NULL AND
:title IS NOT NULL AND
library.artist = :artist AND
library.title = :title
)
""", trackAttr)
row = cur.fetchone()
if row == None:
continue
crateTrack = {
'cid' : crate['id'],
'tid' : row['id']
}
cur.execute("""
SELECT COUNT(*) AS count
FROM crate_tracks
WHERE
crate_id = :cid
AND track_id = :tid
""", crateTrack)
row = cur.fetchone()
if row['count'] <= 0:
cur.execute("""
INSERT INTO crate_tracks (crate_id, track_id)
VALUES (:cid, :tid)
""", crateTrack)
if __name__ == '__main__':
parser = OptionParser()
parser.add_option("-f", "--file", dest="filename",
help="file to import from/export to", metavar="FILE")
parser.add_option("-d", "--database", dest="database",
help="The Mixxx SQLite database to import to/export from",
default=os.environ['HOME'] + '/.mixxx/mixxxdb.sqlite')
(options, args) = parser.parse_args()
db = sqlite3.connect(options.database)
db.row_factory = sqlite3.Row
if sys.argv[1] == 'export':
if options.filename != None:
fp = open(options.filename, "w+")
else:
fp = sys.stdout
ExportCrates(db, fp)
elif sys.argv[1] == 'import':
if options.filename != None:
fp = open(options.filename, "r+")
else:
fp = sys.stdin
ImportCrates(db, fp)
db.commit()
------------------------------------------------------------------------------
Download new Adobe(R) Flash(R) Builder(TM) 4
The new Adobe(R) Flex(R) 4 and Flash(R) Builder(TM) 4 (formerly
Flex(R) Builder(TM)) enable the development of rich applications that run
across multiple browsers and platforms. Download your free trials today!
http://p.sf.net/sfu/adobe-dev2dev
_______________________________________________
Mixxx-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mixxx-devel