mirror of
https://github.com/bspeice/Melodia
synced 2024-12-26 00:28:13 -05:00
Optimize scanning further, make song URL's PK
The Primary Key is added because these URL's must be unique anyway - you can't have two filenames point to different files. Additionally, this ensures that the database doesn't have multiple copies of a song.
This commit is contained in:
parent
d4d3ad450a
commit
43bd55d1f5
@ -51,30 +51,19 @@ class Archive (models.Model):
|
|||||||
_regex = '|'.join(( '.*' + ext + '$' for ext in SUPPORTED_AUDIO_EXTENSIONS))
|
_regex = '|'.join(( '.*' + ext + '$' for ext in SUPPORTED_AUDIO_EXTENSIONS))
|
||||||
regex = re.compile(_regex, re.IGNORECASE)
|
regex = re.compile(_regex, re.IGNORECASE)
|
||||||
|
|
||||||
#Remove songs in the database if they exist no longer
|
#It's hackish, but far fewer transactions to delete everything first, and add it all back.
|
||||||
# -Do this first since we don't need to re-check songs that were just added
|
#If we get interrupted, just re-run it.
|
||||||
for song in self.songs.all():
|
self.songs.all().delete()
|
||||||
if not os.path.isfile(song.url):
|
|
||||||
song.delete()
|
|
||||||
continue
|
|
||||||
|
|
||||||
#Add new songs
|
#Add new songs
|
||||||
for dirname, dirnames, filenames in os.walk(self.root_folder):
|
for dirname, dirnames, filenames in os.walk(self.root_folder):
|
||||||
#For each filename that is supported
|
#For each filename that is supported
|
||||||
for filename in itertools.ifilter(lambda filename: re.match(regex, filename), filenames):
|
for filename in itertools.ifilter(lambda filename: re.match(regex, filename), filenames):
|
||||||
#Make sure that `filename` is in the database
|
rel_url = os.path.join(dirname, filename)
|
||||||
try:
|
full_url = os.path.abspath(rel_url)
|
||||||
rel_url = os.path.join(dirname, filename)
|
new_song = Song(url = full_url)
|
||||||
full_url = os.path.abspath(rel_url)
|
new_song.save()
|
||||||
self.songs.get(url = full_url)
|
self.songs.add(new_song)
|
||||||
|
|
||||||
except ObjectDoesNotExist, e:
|
|
||||||
#Song needs to be added to database
|
|
||||||
rel_url = os.path.join(dirname, filename)
|
|
||||||
full_url = os.path.abspath(rel_url)
|
|
||||||
new_song = Song(url = full_url)
|
|
||||||
new_song.save()
|
|
||||||
self.songs.add(new_song)
|
|
||||||
|
|
||||||
def _update_song_metadata(self, use_echonest = False, progress_callback = lambda x, y: None):
|
def _update_song_metadata(self, use_echonest = False, progress_callback = lambda x, y: None):
|
||||||
"""Scan every song in this archive (database only) and make sure all songs are correct
|
"""Scan every song in this archive (database only) and make sure all songs are correct
|
||||||
|
@ -47,7 +47,7 @@ class Song (models.Model):
|
|||||||
bit_rate = models.IntegerField(default = _default_bit_rate)
|
bit_rate = models.IntegerField(default = _default_bit_rate)
|
||||||
duration = models.IntegerField(default = _default_bit_rate)
|
duration = models.IntegerField(default = _default_bit_rate)
|
||||||
echonest_song_id = models.CharField(max_length = 64, default = _default_echonest_song_id)
|
echonest_song_id = models.CharField(max_length = 64, default = _default_echonest_song_id)
|
||||||
url = models.CharField(max_length = 64)
|
url = models.CharField(max_length = 255, primary_key = True)
|
||||||
file_hash = melodia_settings.HASH_RESULT_DB_TYPE
|
file_hash = melodia_settings.HASH_RESULT_DB_TYPE
|
||||||
|
|
||||||
def populate_metadata(self, use_echonest = False):
|
def populate_metadata(self, use_echonest = False):
|
||||||
|
Loading…
Reference in New Issue
Block a user