def _idle(self): """Keep the main thread busy until we're going to shut down""" logger.info("SERVER UP!") while True: if len(get_state().to_raise) > 0: exp = get_state().to_raise.pop() raise exp time.sleep(1)
def _launch_extras(self): """All the add-on stuff""" music_database_config = get_config()[SECTION_MUSIC_DATABASE] if music_database_config[DATABASE_ENABLED].get(bool): from mserv import databases get_state().music_database = databases.init_database(music_database_config) get_state().beets_database = databases.init_beets_database(music_database_config) databases.register_callbacks() mpd_config = get_config()[SECTION_MPD_SERVERS] mpd_server_configs = mpd_config.all_contents() for mpd_server_config in mpd_server_configs: mpd_server = MpdServer.create(mpd_server_config.get(MPD_SERVER, None)) mpd_server.init_all() mpdserver.register_callbacks()
def match_beets_items_to_music_database_items(mode="all"): if mode == "all": bdb = get_state().beets_database mdb = get_state().music_database beets_base_dir = get_config()[SECTION_MUSIC_DATABASE][BEETS_BASE_DIRECTORY].get() bi_class = bdb.get_model("Items") fe_class = mdb.get_model("FileEntry") bifel_class = mdb.get_model("BeetsItemFileEntryLink") bi_entries = bi_class.select().count() logger.info("Beginning a full BeetsItem -> FileEntry matching for " + str(bi_entries) + " records") for bi in bi_class.select(): beets_id = bi.id # First check it's not got a link already... existing_bifel = bifel_class.select().where(bifel_class.beets_item_id == beets_id).exists() if existing_bifel: logger.debug("Existing match for " + str(beets_id)) else: beets_path = bi.path.decode("utf-8") path_to_find = os.path.relpath(beets_path, beets_base_dir) try: dir_to_find, filename_to_find = os.path.split(path_to_find) fe_instance = fe_class.select()\ .where(fe_class.directory == dir_to_find)\ .where(fe_class.filename == filename_to_find)\ .get() bifel_instance = bifel_class() bifel_instance.file = fe_instance bifel_instance.beets_item_id = beets_id bifel_instance.save() logger.info("Found match for " + str(path_to_find)) except fe_class.DoesNotExist: logger.info("No item found for path " + str(path_to_find) + " from beets item " + str(beets_id)) except ValueError: logger.exception("Problem splitting path " + str(path_to_find)) else: raise Exception("Unsupported mode " + str(mode))
def get_music_model(name): return get_state().music_database.get_model(name)
def get_beets_model(name): return get_state().beets_database.get_model(name)
def model(cls): if not cls._underlying_model: cls._underlying_model = get_state().music_database.get_model(cls.get_table_name()) return cls._underlying_model
def get_beets_item(self): beets_id = self._data.beets_item_id beets_item_class = get_state().beets_database.get_model("Items") beets_track = beets_item_class.select().where(beets_item_class.id == beets_id).get() return beets_track
def _restart_server(): get_state().to_raise.append(MServRestartServer)
def _shutdown_server(): get_state().to_raise.append(MServShutdownServer)
def file_scan(): db = get_state().music_database fe_class = db.get_model("FileEntry") base_directory = get_config()[SECTION_MUSIC_DATABASE][MUSIC_BASE_DIRECTORY].get() _scan_dir_recursive_saving_file_entries(base_directory, base_directory, fe_class)