From b00f70ff4b3ab029ca4b5a2f779eb9beb22ae45f Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Tue, 15 Feb 2022 08:17:47 +0000 Subject: [PATCH] v2 tidy/refactor --- app/songdb.py | 121 +--------------------------------------------- test_playlists.py | 8 +++ testdata/mom.py | 6 +++ 3 files changed, 15 insertions(+), 120 deletions(-) create mode 100644 test_playlists.py create mode 100644 testdata/mom.py diff --git a/app/songdb.py b/app/songdb.py index 6173eb8..85b6c59 100755 --- a/app/songdb.py +++ b/app/songdb.py @@ -12,11 +12,11 @@ from models import Notes, Playdates, PlaylistTracks, Session, Tracks from mutagen.flac import FLAC from mutagen.mp3 import MP3 from pydub import AudioSegment, effects -from tinytag import TinyTag # Globals (I know) messages = [] + def main(): "Main loop" @@ -226,86 +226,6 @@ def full_update_db(session): 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): """ Repopulate database @@ -376,44 +296,5 @@ def update_db(session): 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(): main() diff --git a/test_playlists.py b/test_playlists.py new file mode 100644 index 0000000..2b3a264 --- /dev/null +++ b/test_playlists.py @@ -0,0 +1,8 @@ +from app.playlists import PlaylistTab + + +def test_init(session): + """Just check we can create a playlist""" + + playlist = PlaylistTab() + assert playlist diff --git a/testdata/mom.py b/testdata/mom.py new file mode 100644 index 0000000..3952963 --- /dev/null +++ b/testdata/mom.py @@ -0,0 +1,6 @@ +# Tags for mom.py + +{ + "title": "Man of Mystery", + "artist": "The Shadows", +}