Fixed various small things that weren't caught before.

- Fixes SQL queries for table creations
- Table creation is now down in reverse order to accompany the foreign key
- Fixed a typo in the BaseRecognizer that caused it to not work
- Changed configuration passed to Dejavu into a (nested) dictionary
This commit is contained in:
Wessie 2013-12-18 00:31:57 +01:00
parent 1c9eddc3a2
commit 3b72768f94
3 changed files with 59 additions and 74 deletions

View file

@ -8,19 +8,13 @@ import random
DEBUG = False DEBUG = False
class Dejavu(): class Dejavu(object):
def __init__(self, config): def __init__(self, config):
self.config = config self.config = config
# initialize db # initialize db
database = SQLDatabase( self.db = SQLDatabase(**config.get("database", {}))
self.config.get(SQLDatabase.CONNECTION, SQLDatabase.KEY_HOSTNAME),
self.config.get(SQLDatabase.CONNECTION, SQLDatabase.KEY_USERNAME),
self.config.get(SQLDatabase.CONNECTION, SQLDatabase.KEY_PASSWORD),
self.config.get(SQLDatabase.CONNECTION, SQLDatabase.KEY_DATABASE))
self.db = database
# create components # create components
self.converter = Converter() self.converter = Converter()
@ -30,10 +24,10 @@ class Dejavu():
# get songs previously indexed # get songs previously indexed
self.songs = self.db.get_songs() self.songs = self.db.get_songs()
self.songnames_set = set() # to know which ones we've computed before self.songnames_set = set() # to know which ones we've computed before
if self.songs:
for song in self.songs: for song in self.songs:
song_id = song[SQLDatabase.FIELD_SONG_ID] song_name = song[self.db.FIELD_SONGNAME]
song_name = song[SQLDatabase.FIELD_SONGNAME]
self.songnames_set.add(song_name) self.songnames_set.add(song_name)
print "Added: %s to the set of fingerprinted songs..." % song_name print "Added: %s to the set of fingerprinted songs..." % song_name
@ -55,15 +49,9 @@ class Dejavu():
processes = [] processes = []
for i in range(nprocesses): for i in range(nprocesses):
# need database instance since mysql connections shouldn't be shared across processes
sql_connection = SQLDatabase(
self.config.get(SQLDatabase.CONNECTION, SQLDatabase.KEY_HOSTNAME),
self.config.get(SQLDatabase.CONNECTION, SQLDatabase.KEY_USERNAME),
self.config.get(SQLDatabase.CONNECTION, SQLDatabase.KEY_PASSWORD),
self.config.get(SQLDatabase.CONNECTION, SQLDatabase.KEY_DATABASE))
# create process and start it # create process and start it
p = Process(target=self.fingerprint_worker, args=(files_split[i], sql_connection, output)) p = Process(target=self.fingerprint_worker,
args=(files_split[i], self.db, output))
p.start() p.start()
processes.append(p) processes.append(p)

View file

@ -70,7 +70,7 @@ class SQLDatabase(Database):
`%s` binary(10) not null, `%s` binary(10) not null,
`%s` mediumint unsigned not null, `%s` mediumint unsigned not null,
`%s` int unsigned not null, `%s` int unsigned not null,
INDEX(%s), PRIMARY KEY(%s),
UNIQUE(%s, %s, %s), UNIQUE(%s, %s, %s),
FOREIGN KEY (%s) REFERENCES %s(%s) ON DELETE CASCADE FOREIGN KEY (%s) REFERENCES %s(%s) ON DELETE CASCADE
) ENGINE=INNODB;""" % ( ) ENGINE=INNODB;""" % (
@ -157,8 +157,8 @@ class SQLDatabase(Database):
fingerprints associated with them. fingerprints associated with them.
""" """
with self.cursor() as cur: with self.cursor() as cur:
cur.execute(self.CREATE_FINGERPRINTS_TABLE)
cur.execute(self.CREATE_SONGS_TABLE) cur.execute(self.CREATE_SONGS_TABLE)
cur.execute(self.CREATE_FINGERPRINTS_TABLE)
cur.execute(self.DELETE_UNFINGERPRINTED) cur.execute(self.DELETE_UNFINGERPRINTED)
def empty(self): def empty(self):

View file

@ -1,6 +1,6 @@
from multiprocessing import Queue, Process from multiprocessing import Queue, Process
from dejavu.database import SQLDatabase from dejavu.database import SQLDatabase
import dejavu.fingerprint import dejavu.fingerprint as fingerprint
from dejavu import Dejavu from dejavu import Dejavu
from scipy.io import wavfile from scipy.io import wavfile
import wave import wave
@ -15,20 +15,17 @@ class BaseRecognizer(object):
def __init__(self, dejavu): def __init__(self, dejavu):
self.dejavu = dejavu self.dejavu = dejavu
self.Fs = dejavu.fingerprint.DEFAULT_FS self.Fs = fingerprint.DEFAULT_FS
def _recognize(self, *data): def _recognize(self, *data):
matches = [] matches = []
for d in data: for d in data:
matches.extend(self.dejavu.find_matches(data, Fs=self.Fs)) matches.extend(self.dejavu.find_matches(d, Fs=self.Fs))
return self.dejavu.align_matches(matches) return self.dejavu.align_matches(matches)
def recognize(self): def recognize(self):
pass # base class does nothing pass # base class does nothing
class WaveFileRecognizer(BaseRecognizer): class WaveFileRecognizer(BaseRecognizer):
def __init__(self, dejavu, filename=None): def __init__(self, dejavu, filename=None):