diff --git a/.gitignore b/.gitignore
index bb304f9..e649d17 100644
--- a/.gitignore
+++ b/.gitignore
@@ -116,5 +116,7 @@ tmp/
*.db
+templates/*
+
# Pycharm
-.idea/
\ No newline at end of file
+.idea/
diff --git a/interface.py b/interface.py
index 310f5f0..f9135f3 100644
--- a/interface.py
+++ b/interface.py
@@ -207,7 +207,7 @@ def build_tags_color_lookup():
def get_all_dirs():
- dirs = []
+ dirs = ["."]
paths = var.music_db.query_all_paths()
for path in paths:
pos = 0
@@ -225,18 +225,7 @@ def get_all_dirs():
@web.route("/", methods=['GET'])
@requires_auth
def index():
- while var.cache.dir_lock.locked():
- time.sleep(0.1)
-
- tags_color_lookup = build_tags_color_lookup()
- max_upload_file_size = util.parse_file_size(var.config.get("webinterface", "max_upload_file_size", fallback="30MB"))
-
- return render_template('index.html',
- dirs=get_all_dirs(),
- upload_enabled=var.config.getboolean("webinterface", "upload_enabled", fallback=True),
- tags_color_lookup=tags_color_lookup,
- max_upload_file_size=max_upload_file_size
- )
+ return open('templates/index.html', "r").read()
@web.route("/playlist", methods=['GET'])
@@ -527,6 +516,8 @@ def build_library_query_condition(form):
if form['type'] == 'file':
folder = form['dir']
+ if folder == ".":
+ folder = ""
if not folder.endswith('/') and folder:
folder += '/'
condition.and_like('path', folder + '%')
@@ -552,6 +543,26 @@ def build_library_query_condition(form):
abort(400)
+@web.route("/library/info", methods=['GET'])
+@requires_auth
+def library_info():
+ global log
+
+ while var.cache.dir_lock.locked():
+ time.sleep(0.1)
+
+ tags = var.music_db.query_all_tags()
+ max_upload_file_size = util.parse_file_size(var.config.get("webinterface", "max_upload_file_size", fallback="30MB"))
+
+ print(get_all_dirs())
+ return jsonify(dict(
+ dirs=get_all_dirs(),
+ upload_enabled=var.config.getboolean("webinterface", "upload_enabled", fallback=True),
+ tags=tags,
+ max_upload_file_size=max_upload_file_size
+ ))
+
+
@web.route("/library", methods=['POST'])
@requires_auth
def library():
diff --git a/templates/index.html b/templates/index.html
deleted file mode 100644
index c22c3b0..0000000
--- a/templates/index.html
+++ /dev/null
@@ -1 +0,0 @@
-
botamusique web interface Clear Playlist
[File] This is my title - Artist
Add All Rescan Files Download All Delete All
All files listed here, include files on other pages, will be deleted from your hard-drive. Is that what you want?
{% if upload_enabled %}
\ No newline at end of file
diff --git a/templates/need_token.html b/templates/need_token.html
deleted file mode 100644
index 7453429..0000000
--- a/templates/need_token.html
+++ /dev/null
@@ -1 +0,0 @@
-botamusique web interface Token Required! You are accessing the web interface of {{ name }}. A token is needed to grant you access.
Please send "{{ command }}" to the bot in mumble to acquire one.
\ No newline at end of file
diff --git a/web/js/main.mjs b/web/js/main.mjs
index ce1300f..7299f47 100644
--- a/web/js/main.mjs
+++ b/web/js/main.mjs
@@ -7,6 +7,7 @@ import {
Tooltip,
} from 'bootstrap/js/src/index';
import {
+ getColor,
isOverflown,
setProgressBar,
secondsToStr,
@@ -416,18 +417,6 @@ function setFilterType(event, type) {
updateResults();
}
-// Bind Event
-$('.filter-tag').click(function (e) {
- const tag = $(e.currentTarget);
- if (!tag.hasClass('tag-clicked')) {
- tag.addClass('tag-clicked');
- tag.removeClass('tag-unclicked');
- } else {
- tag.addClass('tag-unclicked');
- tag.removeClass('tag-clicked');
- }
- updateResults();
-});
filter_dir.change(function () {
updateResults();
@@ -501,6 +490,9 @@ function bindLibraryResultEvent() {
);
}
+const lib_filter_tag_group = $("#filter-tags");
+const lib_filter_tag_element = $(".filter-tag");
+
const lib_group = $('#library-group');
const id_element = $('.library-item-id');
const title_element = $('.library-item-title');
@@ -513,6 +505,65 @@ const tag_edit_element = $('.library-item-edit');
// var notag_element = $(".library-item-notag");
// var tag_element = $(".library-item-tag");
+function updateLibraryControls(){
+ $.ajax({
+ type: 'GET',
+ url: 'library/info',
+ statusCode: {
+ 200: displayLibraryControls,
+ 403: function () {
+ location.reload(true);
+ },
+ },
+ });
+}
+
+function displayLibraryControls(data){
+ $("#maxUploadFileSize").val(data.max_upload_file_size);
+ if (data.upload_enabled) {
+ $("#uploadDisabled").val("false");
+ $("#upload").show();
+ } else {
+ $("#uploadDisabled").val("true");
+ $("#upload").hide();
+ }
+
+ let select = $("#filter-dir");
+ let dataList = $("#upload-target-dirs");
+ select.find("option").remove();
+ dataList.find("option").remove();
+ if (data.dirs.length > 0) {
+ console.log(data.dirs);
+ data.dirs.forEach(function (dir) {
+ $("" + dir + " ").appendTo(select);
+ $("").appendTo(dataList);
+ });
+ }
+
+ // ----- Tag filters -----
+ $(".filter-tag").remove();
+ if (data.tags.length > 0) {
+ data.tags.forEach(function (tag) {
+ const tag_copy = lib_filter_tag_element.clone();
+ tag_copy.html(tag);
+ tag_copy.addClass('badge-' + getColor(tag));
+ tag_copy.appendTo(lib_filter_tag_group);
+ });
+ }
+ // Bind Event
+ $('.filter-tag').click(function (e) {
+ const tag = $(e.currentTarget);
+ if (!tag.hasClass('tag-clicked')) {
+ tag.addClass('tag-clicked');
+ tag.removeClass('tag-unclicked');
+ } else {
+ tag.addClass('tag-unclicked');
+ tag.removeClass('tag-clicked');
+ }
+ updateResults();
+ });
+}
+
function addResultItem(item) {
id_element.val(item.id);
title_element.html(item.title);
@@ -609,6 +660,8 @@ function updateResults(dest_page = 1) {
opacity: 1,
}, 200);
});
+
+ updateLibraryControls();
}
const download_form = $('#download-form');
@@ -1210,10 +1263,10 @@ function playheadDragged(event) {
// ----- Application -----
// -----------------------
-updateResults();
-
document.addEventListener('DOMContentLoaded', () => {
+ updateResults();
updatePlaylist();
+ updateLibraryControls();
// Check the version of playlist to see if update is needed.
setInterval(checkForPlaylistUpdate, 3000);
diff --git a/web/js/util.js b/web/js/util.js
index 2c50c49..b5b2b1c 100644
--- a/web/js/util.js
+++ b/web/js/util.js
@@ -2,6 +2,42 @@ export function isOverflown(element) {
return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;
}
+export function hash(string) {
+ if (typeof string != "string") return 0;
+ let hash = 0;
+ if (string.length === 0) {
+ return hash;
+ }
+ for (let i = 0; i < string.length; i++) {
+ let char = string.charCodeAt(i);
+ hash = ((hash<<5)-hash)+char;
+ hash = hash & hash; // Convert to 32bit integer
+ }
+ return hash;
+}
+
+export function getColor(string) {
+ let num = hash(string) % 8;
+ switch(num) {
+ case 0:
+ return "primary";
+ case 1:
+ return "secondary";
+ case 2:
+ return "success";
+ case 3:
+ return "danger";
+ case 4:
+ return "warning";
+ case 5:
+ return "info";
+ case 6:
+ return "light";
+ case 7:
+ return "dark";
+ }
+}
+
export function setProgressBar(bar, progress, text = '') {
const progPos = (-1 * (1 - progress) * bar.scrollWidth).toString();
const progStr = (progress * 100).toString();
@@ -32,4 +68,4 @@ export function coverArtString(title) {
}
return 'Cover art for ' + nameOfSong;
-}
\ No newline at end of file
+}
diff --git a/web/templates/index.html b/web/templates/index.html
index f87f011..c51485c 100644
--- a/web/templates/index.html
+++ b/web/templates/index.html
@@ -183,9 +183,6 @@
.
- {% for dir in dirs %}
- {{ dir }}
- {% endfor %}
@@ -197,12 +194,9 @@
-
+
Tags
- {% for tag in tags_color_lookup.keys() %}
- {{ tag }}
- {% endfor %}
+
@@ -338,12 +332,8 @@
- {% if upload_enabled %}
- {% else %}
-
-
- {% endif %}
+
@@ -552,7 +539,7 @@
-
+