diff --git a/database.py b/database.py index 2293f84..5b404b2 100644 --- a/database.py +++ b/database.py @@ -329,19 +329,16 @@ class MusicDatabase: return self._result_to_dict(results) + def query_music_by_id(self, _id): + return self.query_music(Condition().and_equal("id", _id)) + def query_music_by_keywords(self, keywords): condition = Condition() for keyword in keywords: condition.and_like("title", f"%{keyword}%", case_sensitive=False) - conn = sqlite3.connect(self.db_path) - cursor = conn.cursor() - results = cursor.execute("SELECT id, type, title, metadata, tags FROM music " - "WHERE %s" % condition.sql(), condition.filler).fetchall() - conn.close() - - return self._result_to_dict(results) + return self.query_music(condition) def query_music_by_tags(self, tags): condition = Condition() @@ -349,13 +346,7 @@ class MusicDatabase: for tag in tags: condition.and_like("tags", f"%{tag},%", case_sensitive=False) - conn = sqlite3.connect(self.db_path) - cursor = conn.cursor() - results = cursor.execute("SELECT id, type, title, metadata, tags FROM music " - "WHERE %s" % condition.sql(), condition.filler).fetchall() - conn.close() - - return self._result_to_dict(results) + return self.query_music(condition) def query_tags(self, condition): # TODO: Can we keep a index of tags? diff --git a/interface.py b/interface.py index 43f09a0..f10a5e6 100644 --- a/interface.py +++ b/interface.py @@ -11,7 +11,7 @@ import shutil from werkzeug.utils import secure_filename import errno import media -from media.item import dicts_to_items +from media.item import dicts_to_items, dict_to_item from media.cache import get_cached_wrapper_from_scrap, get_cached_wrapper_by_id, get_cached_wrappers_by_tags, \ get_cached_wrapper from database import MusicDatabase, Condition @@ -172,7 +172,7 @@ def playlist(): if len(var.playlist) == 0: return jsonify({'items': [render_template('playlist.html', m=False, - index=-1 + index=None )] }) @@ -290,18 +290,16 @@ def post(): var.bot.is_pause = False time.sleep(0.1) - elif 'delete_music_file' in request.form and ".." not in request.form['delete_music_file']: - path = var.music_folder + request.form['delete_music_file'] - if os.path.isfile(path): - log.info("web: delete file " + path) - os.remove(path) + elif 'delete_item_from_library' in request.form: + _id = request.form['delete_item_from_library'] + var.playlist.remove_by_id(_id) + item = var.cache.get_item_by_id(var.bot, _id) - elif 'delete_folder' in request.form and ".." not in request.form['delete_folder']: - path = var.music_folder + request.form['delete_folder'] - if os.path.isdir(path): - log.info("web: delete folder " + path) - shutil.rmtree(path) - time.sleep(0.1) + if os.path.isfile(item.uri()): + log.info("web: delete file " + item.uri()) + os.remove(item.uri()) + + var.cache.free_and_delete(_id) elif 'add_tag' in request.form: music_wrappers = get_cached_wrappers_by_tags(var.bot, [request.form['add_tag']], user) @@ -372,6 +370,7 @@ def build_library_query_condition(form): if file.startswith(folder): sub_cond.or_equal("id", var.cache.file_id_lookup[file]) condition.and_sub_condition(sub_cond) + condition.and_equal("type", "file") elif form['type'] == 'url': condition.and_equal("type", "url") elif form['type'] == 'radio': @@ -406,6 +405,9 @@ def library(): condition = build_library_query_condition(request.form) total_count = var.music_db.query_music_count(condition) + if not total_count: + abort(404) + page_count = math.ceil(total_count / ITEM_PER_PAGE) current_page = int(request.form['page']) if 'page' in request.form else 1 @@ -424,6 +426,21 @@ def library(): log.info("cmd: add to playlist: " + music_wrapper.format_debug_string()) + return redirect("./", code=302) + elif 'action' in request.form and request.form['action'] == 'delete': + for item in items: + var.playlist.remove_by_id(item.id) + item = var.cache.get_item_by_id(var.bot, item.id) + + if os.path.isfile(item.uri()): + log.info("web: delete file " + item.uri()) + os.remove(item.uri()) + + var.cache.free_and_delete(item.id) + + if len(os.listdir(var.music_folder + request.form['dir'])) == 0: + os.rmdir(var.music_folder + request.form['dir']) + return redirect("./", code=302) else: results = [] diff --git a/media/cache.py b/media/cache.py index 3773355..209268a 100644 --- a/media/cache.py +++ b/media/cache.py @@ -73,7 +73,7 @@ class MusicCache(dict): return items def fetch(self, bot, id): - music_dicts = self.db.query_music(Condition().and_equal("id", id)) + music_dicts = self.db.query_music_by_id(id) if music_dicts: music_dict = music_dicts[0] self[id] = dict_to_item(bot, music_dict) diff --git a/media/playlist.py b/media/playlist.py index 55dca33..f13fbbd 100644 --- a/media/playlist.py +++ b/media/playlist.py @@ -268,9 +268,9 @@ class OneshotPlaylist(BasePlaylist): return self def next(self): - self.version += 1 - if len(self) > 0: + self.version += 1 + if self.current_index != -1: super().__delitem__(self.current_index) if len(self) == 0: diff --git a/templates/index.html b/templates/index.html index c7c5596..cdcb7b1 100644 --- a/templates/index.html +++ b/templates/index.html @@ -247,12 +247,13 @@