Compare commits
No commits in common. "ea4d7693efb2a8f473ad52962bd51a2c47be99ce" and "f2a27366d3ee0f5d380c78fea4f3bd6dbd81726d" have entirely different histories.
ea4d7693ef
...
f2a27366d3
@ -4,9 +4,11 @@ from typing import List, Optional
|
|||||||
|
|
||||||
|
|
||||||
class Config(object):
|
class Config(object):
|
||||||
|
AUDACITY_COMMAND = "/usr/bin/audacity"
|
||||||
AUDIO_SEGMENT_CHUNK_SIZE = 10
|
AUDIO_SEGMENT_CHUNK_SIZE = 10
|
||||||
BITRATE_LOW_THRESHOLD = 192
|
BITRATE_LOW_THRESHOLD = 192
|
||||||
BITRATE_OK_THRESHOLD = 300
|
BITRATE_OK_THRESHOLD = 300
|
||||||
|
CHECK_AUDACITY_AT_STARTUP = True
|
||||||
CART_DIRECTORY = "/home/kae/radio/CartTracks"
|
CART_DIRECTORY = "/home/kae/radio/CartTracks"
|
||||||
CARTS_COUNT = 10
|
CARTS_COUNT = 10
|
||||||
CARTS_HIDE = True
|
CARTS_HIDE = True
|
||||||
@ -19,16 +21,19 @@ class Config(object):
|
|||||||
COLOUR_CART_PROGRESSBAR = "#000000"
|
COLOUR_CART_PROGRESSBAR = "#000000"
|
||||||
COLOUR_CART_READY = "#ffc107"
|
COLOUR_CART_READY = "#ffc107"
|
||||||
COLOUR_CART_UNCONFIGURED = "#f2f2f2"
|
COLOUR_CART_UNCONFIGURED = "#f2f2f2"
|
||||||
|
COLOUR_CURRENT_HEADER = "#d4edda"
|
||||||
COLOUR_CURRENT_PLAYLIST = "#7eca8f"
|
COLOUR_CURRENT_PLAYLIST = "#7eca8f"
|
||||||
COLOUR_CURRENT_TAB = "#248f24"
|
COLOUR_CURRENT_TAB = "#248f24"
|
||||||
COLOUR_ENDING_TIMER = "#dc3545"
|
COLOUR_ENDING_TIMER = "#dc3545"
|
||||||
COLOUR_EVEN_PLAYLIST = "#d9d9d9"
|
COLOUR_EVEN_PLAYLIST = "#d9d9d9"
|
||||||
COLOUR_LONG_START = "#dc3545"
|
COLOUR_LONG_START = "#dc3545"
|
||||||
|
COLOUR_NEXT_HEADER = "#fff3cd"
|
||||||
COLOUR_NEXT_PLAYLIST = "#ffc107"
|
COLOUR_NEXT_PLAYLIST = "#ffc107"
|
||||||
COLOUR_NEXT_TAB = "#b38600"
|
COLOUR_NEXT_TAB = "#b38600"
|
||||||
COLOUR_NORMAL_TAB = "#000000"
|
COLOUR_NORMAL_TAB = "#000000"
|
||||||
COLOUR_NOTES_PLAYLIST = "#b8daff"
|
COLOUR_NOTES_PLAYLIST = "#b8daff"
|
||||||
COLOUR_ODD_PLAYLIST = "#f2f2f2"
|
COLOUR_ODD_PLAYLIST = "#f2f2f2"
|
||||||
|
COLOUR_PREVIOUS_HEADER = "#f8d7da"
|
||||||
COLOUR_UNREADABLE = "#dc3545"
|
COLOUR_UNREADABLE = "#dc3545"
|
||||||
COLOUR_WARNING_TIMER = "#ffc107"
|
COLOUR_WARNING_TIMER = "#ffc107"
|
||||||
COLUMN_NAME_ARTIST = "Artist"
|
COLUMN_NAME_ARTIST = "Artist"
|
||||||
@ -41,10 +46,13 @@ class Config(object):
|
|||||||
COLUMN_NAME_NOTES = "Notes"
|
COLUMN_NAME_NOTES = "Notes"
|
||||||
COLUMN_NAME_START_TIME = "Start"
|
COLUMN_NAME_START_TIME = "Start"
|
||||||
COLUMN_NAME_TITLE = "Title"
|
COLUMN_NAME_TITLE = "Title"
|
||||||
|
DBFS_FADE = -12
|
||||||
DBFS_SILENCE = -50
|
DBFS_SILENCE = -50
|
||||||
DEBUG_FUNCTIONS: List[Optional[str]] = []
|
DEBUG_FUNCTIONS: List[Optional[str]] = []
|
||||||
DEBUG_MODULES: List[Optional[str]] = ['dbconfig']
|
DEBUG_MODULES: List[Optional[str]] = ['dbconfig']
|
||||||
DEFAULT_COLUMN_WIDTH = 200
|
DEFAULT_COLUMN_WIDTH = 200
|
||||||
|
DEFAULT_IMPORT_DIRECTORY = "/home/kae/Nextcloud/tmp"
|
||||||
|
DEFAULT_OUTPUT_DIRECTORY = "/home/kae/music/Singles"
|
||||||
DISPLAY_SQL = False
|
DISPLAY_SQL = False
|
||||||
ERRORS_FROM = ['noreply@midnighthax.com']
|
ERRORS_FROM = ['noreply@midnighthax.com']
|
||||||
ERRORS_TO = ['kae@midnighthax.com']
|
ERRORS_TO = ['kae@midnighthax.com']
|
||||||
@ -70,6 +78,7 @@ class Config(object):
|
|||||||
ROOT = os.environ.get('ROOT') or "/home/kae/music"
|
ROOT = os.environ.get('ROOT') or "/home/kae/music"
|
||||||
IMPORT_DESTINATION = os.path.join(ROOT, "Singles")
|
IMPORT_DESTINATION = os.path.join(ROOT, "Singles")
|
||||||
SCROLL_TOP_MARGIN = 3
|
SCROLL_TOP_MARGIN = 3
|
||||||
|
TESTMODE = True
|
||||||
TEXT_NO_TRACK_NO_NOTE = "[Section header]"
|
TEXT_NO_TRACK_NO_NOTE = "[Section header]"
|
||||||
TOD_TIME_FORMAT = "%H:%M:%S"
|
TOD_TIME_FORMAT = "%H:%M:%S"
|
||||||
TIMER_MS = 500
|
TIMER_MS = 500
|
||||||
@ -77,3 +86,6 @@ class Config(object):
|
|||||||
VOLUME_VLC_DEFAULT = 75
|
VOLUME_VLC_DEFAULT = 75
|
||||||
VOLUME_VLC_DROP3db = 65
|
VOLUME_VLC_DROP3db = 65
|
||||||
WEB_ZOOM_FACTOR = 1.2
|
WEB_ZOOM_FACTOR = 1.2
|
||||||
|
|
||||||
|
|
||||||
|
config = Config
|
||||||
|
|||||||
@ -235,7 +235,7 @@ def normalise_track(path):
|
|||||||
stats = os.stat(path)
|
stats = os.stat(path)
|
||||||
try:
|
try:
|
||||||
# Copy original file
|
# Copy original file
|
||||||
_, temp_path = tempfile.mkstemp()
|
fd, temp_path = tempfile.mkstemp()
|
||||||
shutil.copyfile(path, temp_path)
|
shutil.copyfile(path, temp_path)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
log.debug(
|
log.debug(
|
||||||
|
|||||||
@ -67,7 +67,7 @@ log.addHandler(stderr)
|
|||||||
log.addHandler(syslog)
|
log.addHandler(syslog)
|
||||||
|
|
||||||
|
|
||||||
def log_uncaught_exceptions(_ex_cls, ex, tb):
|
def log_uncaught_exceptions(ex_cls, ex, tb):
|
||||||
|
|
||||||
from helpers import send_mail
|
from helpers import send_mail
|
||||||
|
|
||||||
@ -75,7 +75,6 @@ def log_uncaught_exceptions(_ex_cls, ex, tb):
|
|||||||
logging.critical(''.join(traceback.format_tb(tb)))
|
logging.critical(''.join(traceback.format_tb(tb)))
|
||||||
print("\033[1;37;40m")
|
print("\033[1;37;40m")
|
||||||
print(stackprinter.format(ex, style="darkbg2", add_summary=True))
|
print(stackprinter.format(ex, style="darkbg2", add_summary=True))
|
||||||
if os.environ("MM_ENV") != "DEVELOPMENT":
|
|
||||||
msg = stackprinter.format(ex)
|
msg = stackprinter.format(ex)
|
||||||
send_mail(Config.ERRORS_TO, Config.ERRORS_FROM,
|
send_mail(Config.ERRORS_TO, Config.ERRORS_FROM,
|
||||||
"Exception from musicmuster", msg)
|
"Exception from musicmuster", msg)
|
||||||
|
|||||||
@ -1,16 +1,17 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
#
|
||||||
import os.path
|
import os.path
|
||||||
import re
|
import re
|
||||||
import stackprinter
|
import stackprinter
|
||||||
|
#
|
||||||
from dbconfig import Session
|
from dbconfig import Session
|
||||||
|
#
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import List, Optional
|
from typing import List, Optional
|
||||||
|
#
|
||||||
|
# from pydub import AudioSegment
|
||||||
from sqlalchemy.ext.associationproxy import association_proxy
|
from sqlalchemy.ext.associationproxy import association_proxy
|
||||||
|
# from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta
|
||||||
from sqlalchemy import (
|
from sqlalchemy import (
|
||||||
Boolean,
|
Boolean,
|
||||||
Column,
|
Column,
|
||||||
@ -22,16 +23,22 @@ from sqlalchemy import (
|
|||||||
Integer,
|
Integer,
|
||||||
select,
|
select,
|
||||||
String,
|
String,
|
||||||
|
UniqueConstraint,
|
||||||
update,
|
update,
|
||||||
)
|
)
|
||||||
|
# from sqlalchemy.exc import IntegrityError
|
||||||
from sqlalchemy.orm import (
|
from sqlalchemy.orm import (
|
||||||
|
backref,
|
||||||
declarative_base,
|
declarative_base,
|
||||||
relationship,
|
relationship,
|
||||||
|
RelationshipProperty
|
||||||
)
|
)
|
||||||
|
from sqlalchemy.orm.collections import attribute_mapped_collection
|
||||||
from sqlalchemy.orm.exc import (
|
from sqlalchemy.orm.exc import (
|
||||||
|
# MultipleResultsFound,
|
||||||
NoResultFound
|
NoResultFound
|
||||||
)
|
)
|
||||||
|
#
|
||||||
from config import Config
|
from config import Config
|
||||||
from helpers import (
|
from helpers import (
|
||||||
fade_point,
|
fade_point,
|
||||||
@ -41,6 +48,7 @@ from helpers import (
|
|||||||
trailing_silence,
|
trailing_silence,
|
||||||
)
|
)
|
||||||
from log import log
|
from log import log
|
||||||
|
#
|
||||||
Base = declarative_base()
|
Base = declarative_base()
|
||||||
|
|
||||||
|
|
||||||
@ -75,6 +83,23 @@ class Carts(Base):
|
|||||||
session.add(self)
|
session.add(self)
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_or_create(cls, session: Session, cart_number: int) -> "Carts":
|
||||||
|
"""
|
||||||
|
Return cart with passed cart number, or create a record if
|
||||||
|
none exists.
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
return (
|
||||||
|
session.execute(
|
||||||
|
select(Carts)
|
||||||
|
.where(Carts.cart_number == cart_number)
|
||||||
|
).scalar_one()
|
||||||
|
)
|
||||||
|
except NoResultFound:
|
||||||
|
return Carts(session, cart_number)
|
||||||
|
|
||||||
|
|
||||||
class NoteColours(Base):
|
class NoteColours(Base):
|
||||||
__tablename__ = 'notecolours'
|
__tablename__ = 'notecolours'
|
||||||
@ -445,6 +470,19 @@ class PlaylistRows(Base):
|
|||||||
# Delete won't take effect until commit()
|
# Delete won't take effect until commit()
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def delete_rows(session: Session, ids: List[int]) -> None:
|
||||||
|
"""
|
||||||
|
Delete passed ids
|
||||||
|
"""
|
||||||
|
|
||||||
|
session.execute(
|
||||||
|
delete(PlaylistRows)
|
||||||
|
.where(PlaylistRows.id.in_(ids))
|
||||||
|
)
|
||||||
|
# Delete won't take effect until commit()
|
||||||
|
session.commit()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def fixup_rownumbers(session: Session, playlist_id: int) -> None:
|
def fixup_rownumbers(session: Session, playlist_id: int) -> None:
|
||||||
"""
|
"""
|
||||||
@ -463,6 +501,19 @@ class PlaylistRows(Base):
|
|||||||
# Ensure new row numbers are available to the caller
|
# Ensure new row numbers are available to the caller
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_plr(session: Session, row_number: int,
|
||||||
|
playlist_id: int) -> "PlaylistRows":
|
||||||
|
"""Return playlistrows object matching passed parameters"""
|
||||||
|
|
||||||
|
return (
|
||||||
|
select(PlaylistRows)
|
||||||
|
.where(
|
||||||
|
PlaylistRows.row_number == row_number,
|
||||||
|
PlaylistRows.playlist_id == playlist_id)
|
||||||
|
.limit(1)
|
||||||
|
).first()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_track_plr(session: Session, track_id: int,
|
def get_track_plr(session: Session, track_id: int,
|
||||||
playlist_id: int) -> Optional["PlaylistRows"]:
|
playlist_id: int) -> Optional["PlaylistRows"]:
|
||||||
|
|||||||
@ -19,8 +19,11 @@ class Music:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
|
# self.current_track_start_time = None
|
||||||
|
# self.fading = 0
|
||||||
self.VLC = vlc.Instance()
|
self.VLC = vlc.Instance()
|
||||||
self.player = None
|
self.player = None
|
||||||
|
# self.track_path = None
|
||||||
self.max_volume = Config.VOLUME_VLC_DEFAULT
|
self.max_volume = Config.VOLUME_VLC_DEFAULT
|
||||||
|
|
||||||
def fade(self) -> None:
|
def fade(self) -> None:
|
||||||
@ -106,6 +109,7 @@ class Music:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
status = -1
|
status = -1
|
||||||
|
self.track_path = path
|
||||||
|
|
||||||
if Config.COLON_IN_PATH_FIX:
|
if Config.COLON_IN_PATH_FIX:
|
||||||
media = self.VLC.media_new_path(path)
|
media = self.VLC.media_new_path(path)
|
||||||
|
|||||||
@ -42,6 +42,7 @@ from models import (
|
|||||||
)
|
)
|
||||||
from config import Config
|
from config import Config
|
||||||
from playlists import PlaylistTab
|
from playlists import PlaylistTab
|
||||||
|
from sqlalchemy.orm.exc import DetachedInstanceError
|
||||||
from ui.dlg_cart_ui import Ui_DialogCartEdit # type: ignore
|
from ui.dlg_cart_ui import Ui_DialogCartEdit # type: ignore
|
||||||
from ui.dlg_search_database_ui import Ui_Dialog # type: ignore
|
from ui.dlg_search_database_ui import Ui_Dialog # type: ignore
|
||||||
from ui.dlg_SelectPlaylist_ui import Ui_dlgSelectPlaylist # type: ignore
|
from ui.dlg_SelectPlaylist_ui import Ui_dlgSelectPlaylist # type: ignore
|
||||||
@ -1038,6 +1039,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
)
|
)
|
||||||
fade_at = self.current_track.fade_at
|
fade_at = self.current_track.fade_at
|
||||||
silence_at = self.current_track.silence_at
|
silence_at = self.current_track.silence_at
|
||||||
|
length = self.current_track.duration
|
||||||
self.label_fade_length.setText(
|
self.label_fade_length.setText(
|
||||||
helpers.ms_to_mmss(silence_at - fade_at))
|
helpers.ms_to_mmss(silence_at - fade_at))
|
||||||
self.label_start_time.setText(
|
self.label_start_time.setText(
|
||||||
@ -1589,6 +1591,7 @@ class SelectPlaylistDialog(QDialog):
|
|||||||
self.ui.buttonBox.rejected.connect(self.close)
|
self.ui.buttonBox.rejected.connect(self.close)
|
||||||
self.session = session
|
self.session = session
|
||||||
self.playlist = None
|
self.playlist = None
|
||||||
|
self.plid = None
|
||||||
|
|
||||||
record = Settings.get_int_settings(
|
record = Settings.get_int_settings(
|
||||||
self.session, "select_playlist_dialog_width")
|
self.session, "select_playlist_dialog_width")
|
||||||
|
|||||||
@ -34,6 +34,7 @@ from PyQt5.QtWidgets import (
|
|||||||
QStyledItemDelegate,
|
QStyledItemDelegate,
|
||||||
QTableWidget,
|
QTableWidget,
|
||||||
QTableWidgetItem,
|
QTableWidgetItem,
|
||||||
|
QTextEdit,
|
||||||
QWidget
|
QWidget
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -64,6 +65,8 @@ MINIMUM_ROW_HEIGHT = 30
|
|||||||
|
|
||||||
|
|
||||||
class RowMeta:
|
class RowMeta:
|
||||||
|
CLEAR = 0
|
||||||
|
NOTE = 1
|
||||||
UNREADABLE = 2
|
UNREADABLE = 2
|
||||||
NEXT = 3
|
NEXT = 3
|
||||||
CURRENT = 4
|
CURRENT = 4
|
||||||
@ -970,6 +973,12 @@ class PlaylistTab(QTableWidget):
|
|||||||
|
|
||||||
self.selectRow(row)
|
self.selectRow(row)
|
||||||
|
|
||||||
|
def set_searchtext(self, text: Optional[str]) -> None:
|
||||||
|
"""Set the search text and find first match"""
|
||||||
|
|
||||||
|
self.search_text = text
|
||||||
|
self._find_next_match()
|
||||||
|
|
||||||
def set_selected_as_next(self) -> None:
|
def set_selected_as_next(self) -> None:
|
||||||
"""Sets the select track as next to play"""
|
"""Sets the select track as next to play"""
|
||||||
|
|
||||||
@ -1009,6 +1018,7 @@ class PlaylistTab(QTableWidget):
|
|||||||
p.row_number for p in PlaylistRows.get_played_rows(
|
p.row_number for p in PlaylistRows.get_played_rows(
|
||||||
session, self.playlist_id)
|
session, self.playlist_id)
|
||||||
]
|
]
|
||||||
|
unreadable: List[int] = self._get_unreadable_track_rows()
|
||||||
|
|
||||||
next_start_time = None
|
next_start_time = None
|
||||||
section_start_plr = None
|
section_start_plr = None
|
||||||
@ -1329,6 +1339,16 @@ class PlaylistTab(QTableWidget):
|
|||||||
return (index.row() + 1 if self._is_below(event.pos(), index)
|
return (index.row() + 1 if self._is_below(event.pos(), index)
|
||||||
else index.row())
|
else index.row())
|
||||||
|
|
||||||
|
def _find_next_match(self) -> None:
|
||||||
|
"""
|
||||||
|
Find next match of search_text. Start at first highlighted row
|
||||||
|
if there is one, else from top of playlist.
|
||||||
|
"""
|
||||||
|
|
||||||
|
start_row = self._get_selected_row()
|
||||||
|
if start_row is None:
|
||||||
|
start_row = 0
|
||||||
|
|
||||||
def _find_next_track_row(self, session: Session,
|
def _find_next_track_row(self, session: Session,
|
||||||
starting_row: int = None) -> Optional[int]:
|
starting_row: int = None) -> Optional[int]:
|
||||||
"""
|
"""
|
||||||
@ -1480,6 +1500,11 @@ class PlaylistTab(QTableWidget):
|
|||||||
[row for row in set([a.row() for a in self.selectedItems()])]
|
[row for row in set([a.row() for a in self.selectedItems()])]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _get_unreadable_track_rows(self) -> List[int]:
|
||||||
|
"""Return rows marked as unreadable, or None"""
|
||||||
|
|
||||||
|
return self._meta_search(RowMeta.UNREADABLE, one=False)
|
||||||
|
|
||||||
def _info_row(self, track_id: int) -> None:
|
def _info_row(self, track_id: int) -> None:
|
||||||
"""Display popup with info re row"""
|
"""Display popup with info re row"""
|
||||||
|
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
# the current directory contains a "better" version of the file than the
|
# the current directory contains a "better" version of the file than the
|
||||||
# parent (eg, bettet bitrate).
|
# parent (eg, bettet bitrate).
|
||||||
|
|
||||||
|
import glob
|
||||||
import os
|
import os
|
||||||
import pydymenu # type: ignore
|
import pydymenu # type: ignore
|
||||||
import shutil
|
import shutil
|
||||||
@ -20,6 +21,7 @@ from helpers import (
|
|||||||
|
|
||||||
from models import Tracks
|
from models import Tracks
|
||||||
from dbconfig import Session
|
from dbconfig import Session
|
||||||
|
from thefuzz import process # type: ignore
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
@ -33,6 +35,15 @@ source_dir = '/home/kae/music/Singles/tmp'
|
|||||||
parent_dir = os.path.dirname(source_dir)
|
parent_dir = os.path.dirname(source_dir)
|
||||||
# #########################################################
|
# #########################################################
|
||||||
|
|
||||||
|
|
||||||
|
def insensitive_glob(pattern):
|
||||||
|
"""Helper for case insensitive glob.glob()"""
|
||||||
|
|
||||||
|
def either(c):
|
||||||
|
return '[%s%s]' % (c.lower(), c.upper()) if c.isalpha() else c
|
||||||
|
return glob.glob(''.join(map(either, pattern)))
|
||||||
|
|
||||||
|
|
||||||
name_and_tags: List[str] = []
|
name_and_tags: List[str] = []
|
||||||
tags_not_name: List[str] = []
|
tags_not_name: List[str] = []
|
||||||
multiple_similar: List[str] = []
|
multiple_similar: List[str] = []
|
||||||
@ -126,6 +137,10 @@ def main():
|
|||||||
|
|
||||||
# Try to find a near match
|
# Try to find a near match
|
||||||
|
|
||||||
|
# stem = new_fname.split(".")[0]
|
||||||
|
# matches = insensitive_glob(os.path.join(parent_dir, stem) + '*')
|
||||||
|
# match_count = len(matches)
|
||||||
|
# if match_count == 0:
|
||||||
if process_no_matches:
|
if process_no_matches:
|
||||||
prompt = f"\n file={new_fname}\n title={new_title}\n artist={new_artist}: "
|
prompt = f"\n file={new_fname}\n title={new_title}\n artist={new_artist}: "
|
||||||
# Use fzf to search
|
# Use fzf to search
|
||||||
|
|||||||
@ -16,6 +16,20 @@ from log import log
|
|||||||
from models import Tracks
|
from models import Tracks
|
||||||
|
|
||||||
|
|
||||||
|
def create_track(session, path, normalise=None):
|
||||||
|
"""
|
||||||
|
Create track in database from passed path.
|
||||||
|
|
||||||
|
Return track.
|
||||||
|
"""
|
||||||
|
|
||||||
|
track = Tracks(session, path)
|
||||||
|
|
||||||
|
set_track_metadata(session, track)
|
||||||
|
if normalise or normalise is None and Config.NORMALISE_ON_IMPORT:
|
||||||
|
normalise_track(path)
|
||||||
|
|
||||||
|
|
||||||
def check_db(session):
|
def check_db(session):
|
||||||
"""
|
"""
|
||||||
Database consistency check.
|
Database consistency check.
|
||||||
@ -30,7 +44,7 @@ def check_db(session):
|
|||||||
db_paths = set([a.path for a in Tracks.get_all(session)])
|
db_paths = set([a.path for a in Tracks.get_all(session)])
|
||||||
|
|
||||||
os_paths_list = []
|
os_paths_list = []
|
||||||
for root, _dirs, files in os.walk(Config.ROOT):
|
for root, dirs, files in os.walk(Config.ROOT):
|
||||||
for f in files:
|
for f in files:
|
||||||
path = os.path.join(root, f)
|
path = os.path.join(root, f)
|
||||||
ext = os.path.splitext(f)[1]
|
ext = os.path.splitext(f)[1]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user