v2 tidy/refactor
This commit is contained in:
parent
9fb05079dc
commit
b00f70ff4b
121
app/songdb.py
121
app/songdb.py
@ -12,11 +12,11 @@ from models import Notes, Playdates, PlaylistTracks, Session, Tracks
|
|||||||
from mutagen.flac import FLAC
|
from mutagen.flac import FLAC
|
||||||
from mutagen.mp3 import MP3
|
from mutagen.mp3 import MP3
|
||||||
from pydub import AudioSegment, effects
|
from pydub import AudioSegment, effects
|
||||||
from tinytag import TinyTag
|
|
||||||
|
|
||||||
# Globals (I know)
|
# Globals (I know)
|
||||||
messages = []
|
messages = []
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
"Main loop"
|
"Main loop"
|
||||||
|
|
||||||
@ -226,86 +226,6 @@ def full_update_db(session):
|
|||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
|
|
||||||
def get_audio_segment(path):
|
|
||||||
try:
|
|
||||||
if path.endswith('.mp3'):
|
|
||||||
return AudioSegment.from_mp3(path)
|
|
||||||
elif path.endswith('.flac'):
|
|
||||||
return AudioSegment.from_file(path, "flac")
|
|
||||||
except AttributeError:
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def get_music_info(path):
|
|
||||||
"""
|
|
||||||
Return a dictionary of title, artist, duration-in-milliseconds and path.
|
|
||||||
"""
|
|
||||||
|
|
||||||
tag = TinyTag.get(path)
|
|
||||||
|
|
||||||
return dict(
|
|
||||||
title=tag.title,
|
|
||||||
artist=tag.artist,
|
|
||||||
duration=tag.duration,
|
|
||||||
path=path
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def leading_silence(audio_segment, silence_threshold=Config.DBFS_SILENCE,
|
|
||||||
chunk_size=Config.AUDIO_SEGMENT_CHUNK_SIZE):
|
|
||||||
"""
|
|
||||||
Returns the millisecond/index that the leading silence ends.
|
|
||||||
audio_segment - the segment to find silence in
|
|
||||||
silence_threshold - the upper bound for how quiet is silent in dFBS
|
|
||||||
chunk_size - chunk size for interating over the segment in ms
|
|
||||||
|
|
||||||
https://github.com/jiaaro/pydub/blob/master/pydub/silence.py
|
|
||||||
"""
|
|
||||||
|
|
||||||
trim_ms = 0 # ms
|
|
||||||
assert chunk_size > 0 # to avoid infinite loop
|
|
||||||
while (
|
|
||||||
audio_segment[trim_ms:trim_ms + chunk_size].dBFS < # noqa W504
|
|
||||||
silence_threshold and trim_ms < len(audio_segment)):
|
|
||||||
trim_ms += chunk_size
|
|
||||||
|
|
||||||
# if there is no end it should return the length of the segment
|
|
||||||
return min(trim_ms, len(audio_segment))
|
|
||||||
|
|
||||||
|
|
||||||
def fade_point(audio_segment, fade_threshold=0,
|
|
||||||
chunk_size=Config.AUDIO_SEGMENT_CHUNK_SIZE):
|
|
||||||
"""
|
|
||||||
Returns the millisecond/index of the point where the volume drops below
|
|
||||||
the maximum and doesn't get louder again.
|
|
||||||
audio_segment - the sdlg_search_database_uiegment to find silence in
|
|
||||||
fade_threshold - the upper bound for how quiet is silent in dFBS
|
|
||||||
chunk_size - chunk size for interating over the segment in ms
|
|
||||||
"""
|
|
||||||
|
|
||||||
assert chunk_size > 0 # to avoid infinite loop
|
|
||||||
|
|
||||||
segment_length = audio_segment.duration_seconds * 1000 # ms
|
|
||||||
trim_ms = segment_length - chunk_size
|
|
||||||
max_vol = audio_segment.dBFS
|
|
||||||
if fade_threshold == 0:
|
|
||||||
fade_threshold = max_vol
|
|
||||||
|
|
||||||
while (
|
|
||||||
audio_segment[trim_ms:trim_ms + chunk_size].dBFS < fade_threshold
|
|
||||||
and trim_ms > 0): # noqa W503
|
|
||||||
trim_ms -= chunk_size
|
|
||||||
|
|
||||||
# if there is no trailing silence, return lenght of track (it's less
|
|
||||||
# the chunk_size, but for chunk_size = 10ms, this may be ignored)
|
|
||||||
return int(trim_ms)
|
|
||||||
|
|
||||||
|
|
||||||
def trailing_silence(audio_segment, silence_threshold=-50.0,
|
|
||||||
chunk_size=Config.AUDIO_SEGMENT_CHUNK_SIZE):
|
|
||||||
return fade_point(audio_segment, silence_threshold, chunk_size)
|
|
||||||
|
|
||||||
|
|
||||||
def update_db(session):
|
def update_db(session):
|
||||||
"""
|
"""
|
||||||
Repopulate database
|
Repopulate database
|
||||||
@ -376,44 +296,5 @@ def update_db(session):
|
|||||||
print("\n".join(messages))
|
print("\n".join(messages))
|
||||||
|
|
||||||
|
|
||||||
def update_meta(session, track, artist=None, title=None):
|
|
||||||
"""
|
|
||||||
Updates both the tag info in the file and the database entry with passed
|
|
||||||
artist and tag details.
|
|
||||||
"""
|
|
||||||
|
|
||||||
DEBUG(f"songdb.update_meta({session=}, {track=}, {artist=}, {title=})")
|
|
||||||
|
|
||||||
if not artist and not title:
|
|
||||||
return
|
|
||||||
|
|
||||||
ftype = os.path.splitext(track.path)[1][1:]
|
|
||||||
if ftype == 'flac':
|
|
||||||
tag_handler = FLAC
|
|
||||||
elif ftype == 'mp3':
|
|
||||||
tag_handler = MP3
|
|
||||||
else:
|
|
||||||
INFO(f"File type {ftype} not implemented")
|
|
||||||
return
|
|
||||||
|
|
||||||
# Update tags
|
|
||||||
f = tag_handler(track.path)
|
|
||||||
try:
|
|
||||||
if artist:
|
|
||||||
f["artist"] = artist
|
|
||||||
if title:
|
|
||||||
f["title"] = title
|
|
||||||
f.save()
|
|
||||||
except TypeError:
|
|
||||||
show_warning("TAG error", "Can't update tag. Try editing in Audacity")
|
|
||||||
|
|
||||||
# Update database
|
|
||||||
with Session() as session:
|
|
||||||
if artist:
|
|
||||||
track.update_artist(session, artist)
|
|
||||||
if title:
|
|
||||||
track.update_title(session, title)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__' and '__file__' in globals():
|
if __name__ == '__main__' and '__file__' in globals():
|
||||||
main()
|
main()
|
||||||
|
|||||||
8
test_playlists.py
Normal file
8
test_playlists.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
from app.playlists import PlaylistTab
|
||||||
|
|
||||||
|
|
||||||
|
def test_init(session):
|
||||||
|
"""Just check we can create a playlist"""
|
||||||
|
|
||||||
|
playlist = PlaylistTab()
|
||||||
|
assert playlist
|
||||||
6
testdata/mom.py
vendored
Normal file
6
testdata/mom.py
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# Tags for mom.py
|
||||||
|
|
||||||
|
{
|
||||||
|
"title": "Man of Mystery",
|
||||||
|
"artist": "The Shadows",
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user