From 44926c26d190ab8616a792c10417d6240f50b87f Mon Sep 17 00:00:00 2001
From: deurstann <tristan.derouet@gmail.com>
Date: Wed, 1 Dec 2021 17:10:32 +0100
Subject: [PATCH] Added compatibility with dry update and improved the addition
 of the search result

---
 common/db.js                                 |  4 +-
 common/lkt.js                                | 20 ++++-
 instance/index.js                            | 92 ++++++++++++--------
 instance/views/karaDBUnavailableListItem.ejs | 11 +++
 instance/views/menubar.ejs                   |  3 +-
 instance/views/menubar/buttons.ejs           |  2 +-
 main.js                                      |  8 ++
 7 files changed, 101 insertions(+), 39 deletions(-)
 create mode 100644 instance/views/karaDBUnavailableListItem.ejs

diff --git a/common/db.js b/common/db.js
index 07f555d..c45da3e 100644
--- a/common/db.js
+++ b/common/db.js
@@ -69,7 +69,7 @@ class KaraDatabase {
                             category AS cat,
                             (song_type || song_number) AS type,
                             language, author_name AS author,
-                            song_name AS title, source_name AS source
+                            song_name AS title, source_name AS source, available
                           FROM kara
                           WHERE string LIKE ? OR author_name COLLATE nocase = ?`;
         if (offset != null && limit != null) __sqlQuery += ` LIMIT ${offset}, ${limit}`;
@@ -102,7 +102,7 @@ class KaraDatabase {
                             category AS cat,
                             (song_type || song_number) AS type,
                             language, author_name AS author,
-                            song_name AS title, source_name AS source
+                            song_name AS title, source_name AS source, available
                           FROM kara`;
         if (offset != null && limit != null) __sqlQuery += ` LIMIT ${offset}, ${limit}`;
 
diff --git a/common/lkt.js b/common/lkt.js
index a1fc6a3..3ab1e38 100644
--- a/common/lkt.js
+++ b/common/lkt.js
@@ -176,6 +176,9 @@ class LktClient {
                     if (String(data).includes('player')) {
                         LktClient.reloadState();
                     }
+                    if(String(data).includes('database')) {
+                        LktClient.setDBUpdated(true)
+                    }
                     client.m_socket.write(`idle\n`);
                     return null;
                 });
@@ -394,9 +397,16 @@ class LktClient {
     static commandUpdateDatabase() {
         return LktClient.__execSimple(`password hashire\nupdate`)
     }
+    static commandDryUpdateDatabase(){
+        return LktClient.__execSimple('password hashire\n__dry_update')
+    }
+    static commandDownloadId(id){
+        logger.info(`password hashire\nupdate id://${id}`);
+        return LktClient.__execSimple(`password hashire\nupdate id://${id}`);
+    }
 
     static commandQueueAddSearch(search) {
-        search = search.replace(/ /g,"%");
+        //search = search.replace(/ /g,"%");
         return LktClient.__execSimple(`add query://%${search}%`);
     }
 
@@ -446,6 +456,7 @@ class LktClient {
         return this.__current;
     }
 
+
     static getStatus() {
         LktClient.status_updated = false;
         return this.__status;
@@ -463,6 +474,13 @@ class LktClient {
     static getSongTimeData() {
         return this.timeData;
     }
+    static DBUpdated = false
+    static setDBUpdated(state){
+        this.DBUpdated = state
+    }
+    static isDBUpdated(){
+        return this.DBUpdated
+    }
 
     static ping() {
         var socket = new net.Socket();
diff --git a/instance/index.js b/instance/index.js
index a737e69..1df2781 100644
--- a/instance/index.js
+++ b/instance/index.js
@@ -16,7 +16,6 @@ var currentPlaylist = "";
 var isQueueView = true
 var clearMenuQueue;
 var clearMenuPlaylist;
-var karaDBIDList = [];
 
 function updatePlayPauseButton(state) {
     logger.debug('instance', `State was ${state}`);
@@ -99,6 +98,7 @@ window.onload = () => {
     addIpcToButton('selectDatabase', ['select-database', 'reload-db-request']);
     addIpcToButton('selectPlaylist', ['select-playlist']);
     addIpcToButton('updateDB', ['update-database']);
+    addIpcToButton('dryUpdate',['dry-update-database']);
 
     addIpcToButton('open-kurisu-view', ['toggle-kurisu']);
     addIpcToButton('open-user-view', ['toggle-client-view']);
@@ -252,20 +252,28 @@ window.onload = () => {
 ipcRenderer.on('reload-db-responce', (event, arg) => {
     logger.debug('instance', `Web page got reload-db`);
     document.getElementById('panelLeft').innerHTML = '';
-    karaDBIDList = [];
     arg.forEach(kara => {
-        karaDBIDList.push(kara.id);
-        ejs.renderFile(__dirname + '/views/karaDBListItem.ejs', { kara: kara }, (err, data) => {
-            if (err) logger.error('instance', err);
-            $('#panelLeft').append(data);
-        });
+        if(kara.available==1){
+            ejs.renderFile(__dirname + '/views/karaDBListItem.ejs', { kara: kara }, (err, data) => {
+                if (err) logger.error('instance', err);
+                $('#panelLeft').append(data);
+            });
+        }
+        else{
+            ejs.renderFile(__dirname + '/views/karaDBUnavailableListItem.ejs', { kara: kara }, (err, data) => {
+                if (err) logger.error('instance', err);
+                $('#panelLeft').append(data);
+            });
+        }
     });
     [].forEach.call(document.querySelectorAll('#panelLeft .karaCard'), addDBKaraEventHandlers);
     if(!isQueueView) {
         [].forEach.call(document.querySelectorAll('#panelLeft .karaCard'), (element)=>{
-            element.getElementsByClassName('karaAddBtn')[0].hidden = true;
-            element.getElementsByClassName('karaInsertBtn')[0].hidden = true;
-            element.getElementsByClassName('karaAddPlaylistBtn')[0].hidden = false;
+            if(element.getElementsByClassName('unavailable').length==0){
+                element.getElementsByClassName('karaAddBtn')[0].hidden = true;
+                element.getElementsByClassName('karaInsertBtn')[0].hidden = true;
+                element.getElementsByClassName('karaAddPlaylistBtn')[0].hidden = false;
+            }
         });
     }
 });
@@ -364,28 +372,41 @@ ipcRenderer.on('send-lektord-is-attached', (event, arg) => {
     logger.debug('instance', `Lektord is in attached mode? ${arg}`);
 });
 
+ipcRenderer.on('check-db-updated',(event,arg) => {
+    ipcRenderer.send('reload-db-request')
+});
+
 /*
  * Drag'n'drop functions
  */
 
 function addDBKaraEventHandlers(element) {
-    element.addEventListener('dragstart', onDragStartDB, false);
-    element.addEventListener('dragend', onDragEnd, false);
-    element.getElementsByClassName('karaAddBtn')[0].addEventListener('click', () =>
-        ipcRenderer.send('add-kara-queue-id', {
-            id: element.getElementsByClassName('karaID')[0].innerText,
-        })
-    );
-    element.getElementsByClassName('karaInsertBtn')[0].addEventListener('click', () =>
-        ipcRenderer.send('insert-kara-queue-id', {
-            id: element.getElementsByClassName('karaID')[0].innerText,
-        })
-    );
-    element.getElementsByClassName('karaAddPlaylistBtn')[0].addEventListener('click', () => 
-        ipcRenderer.send('add-kara-playlist-id', {
-            id: element.getElementsByClassName('karaID')[0].innerText,
-        })
-    );
+    if(element.getElementsByClassName('karaDownloadBtn').length==0){
+        element.addEventListener('dragstart', onDragStartDB, false);
+        element.addEventListener('dragend', onDragEnd, false);
+        element.getElementsByClassName('karaAddBtn')[0].addEventListener('click', () =>
+            ipcRenderer.send('add-kara-queue-id', {
+                id: element.getElementsByClassName('karaID')[0].innerText,
+            })
+        );
+        element.getElementsByClassName('karaInsertBtn')[0].addEventListener('click', () =>
+            ipcRenderer.send('insert-kara-queue-id', {
+                id: element.getElementsByClassName('karaID')[0].innerText,
+            })
+        );
+        element.getElementsByClassName('karaAddPlaylistBtn')[0].addEventListener('click', () => 
+            ipcRenderer.send('add-kara-playlist-id', {
+                id: element.getElementsByClassName('karaID')[0].innerText,
+            })
+        );
+    }
+    else{
+        element.getElementsByClassName('karaDownloadBtn')[0].addEventListener('click', () =>
+            ipcRenderer.send('download-kara-id', {
+                id: element.getElementsByClassName('karaID')[0].innerText,
+            })
+        );
+    }
 }
 
 function addQueueKaraEventHandlers(element) {
@@ -486,10 +507,11 @@ function switchQueuePlaylist() {
     if(isQueueView){
         switchQP.innerText = "View playlist";
         [].forEach.call(document.querySelectorAll('#panelLeft .karaCard'), (element)=>{
-
-            element.getElementsByClassName('karaAddBtn')[0].hidden = false;
-        element.getElementsByClassName('karaInsertBtn')[0].hidden = false;
-        element.getElementsByClassName('karaAddPlaylistBtn')[0].hidden = true;
+            if(element.getElementsByClassName('unavailable').length==0){
+                element.getElementsByClassName('karaAddBtn')[0].hidden = false;
+                element.getElementsByClassName('karaInsertBtn')[0].hidden = false;
+                element.getElementsByClassName('karaAddPlaylistBtn')[0].hidden = true;
+            }
         });
         [].forEach.call(document.querySelectorAll('#panelRight .karaCard'), addQueueKaraEventHandlers);
         clearMenuPlaylist();
@@ -497,9 +519,11 @@ function switchQueuePlaylist() {
     else {
         switchQP.innerText = "View queue";
         [].forEach.call(document.querySelectorAll('#panelLeft .karaCard'), (element)=>{
-            element.getElementsByClassName('karaAddBtn')[0].hidden = true;
-            element.getElementsByClassName('karaInsertBtn')[0].hidden = true;
-            element.getElementsByClassName('karaAddPlaylistBtn')[0].hidden = false;
+            if(element.getElementsByClassName('unavailable').length==0){
+                element.getElementsByClassName('karaAddBtn')[0].hidden = true;
+                element.getElementsByClassName('karaInsertBtn')[0].hidden = true;
+                element.getElementsByClassName('karaAddPlaylistBtn')[0].hidden = false;
+            }
         });
         [].forEach.call(document.querySelectorAll('#panelRight .karaCard'), addPlayListKaraEventHandlers);
         clearMenuQueue();
diff --git a/instance/views/karaDBUnavailableListItem.ejs b/instance/views/karaDBUnavailableListItem.ejs
new file mode 100644
index 0000000..b7f5fca
--- /dev/null
+++ b/instance/views/karaDBUnavailableListItem.ejs
@@ -0,0 +1,11 @@
+<%# vim: ts=4 syntax=html
+    The template for the kara card in lists %>
+<li class="card p-2 bd-highlight shadow-none d-flex flex-row bd-highlight mb-3 karaCard bg-dark" draggable="false">
+    <%- include('kara.ejs'); %>
+    <div class="karaElement p-2 bd-highlight">
+        <div class="d-flex flex-row bd-highlight mb-3 btn-group karaActionBtnGroup" role="group">
+            <button class="btn btn-outline-light karaActionBtn karaDownloadBtn" title="Download"><i class="fas fa-upload"></i></button>
+        </div>
+        <div hidden class="unaivailable"></div>
+    </div>
+</li>
diff --git a/instance/views/menubar.ejs b/instance/views/menubar.ejs
index 242e6c7..1af7991 100644
--- a/instance/views/menubar.ejs
+++ b/instance/views/menubar.ejs
@@ -10,7 +10,8 @@
         {id: 'selectAdvence',  tooltip: 'Advence search',       name: 'search'},
         {id: 'selectDatabase', tooltip: 'Database search',      name: 'database'},
         {id: 'selectPlaylist', tooltip: 'Playlist search',      name: 'tag'},
-        {id: 'updateDB',     tooltip: "Update kara Database", name: 'arrow-circle-down'},
+        {id: 'dryUpdate',     tooltip: "Update kara Database", name: 'sync'},
+        {id: 'updateDB',     tooltip: "Update and download kara Database", name: 'arrow-circle-down'},
         {id: 'addResearchToQueue',     tooltip: "Add research result to queue", name: 'upload'},
     ]}); %></div>
     <div class="p-1 bd-highlight mb-1 mr-auto ml-auto" style="width: 40%;-webkit-app-region: no-drag;">
diff --git a/instance/views/menubar/buttons.ejs b/instance/views/menubar/buttons.ejs
index 4c6f60d..484caba 100644
--- a/instance/views/menubar/buttons.ejs
+++ b/instance/views/menubar/buttons.ejs
@@ -6,6 +6,6 @@
     class="btn btn-<%= type %> p-2 bd-highlight"
     data-toggle="tooltip" data-placement="bottom" title="<%= btn.tooltip %>"
     style="-webkit-app-region: no-drag">
-        <i class="fas fa-<%= btn.name %>"></i>
+        <i class="fa fa-<%= btn.name %>"></i>
 </button>
 <% })%>
diff --git a/main.js b/main.js
index aba816c..1db7c68 100644
--- a/main.js
+++ b/main.js
@@ -236,6 +236,7 @@ ipcMain.on('cmd-shuffle', () => lkt.commandShuffle().then(arg => logger.debug('m
 ipcMain.on('cmd-stop', () => lkt.commandStop().then(arg => logger.debug('main', 'Returned from cmd-stop')));
 ipcMain.on('cmd-clear', () => lkt.commandClear().then(arg => logger.debug('main', 'Cleared queue with cmd-clear')));
 ipcMain.on('update-database',()=>lkt.commandUpdateDatabase());
+ipcMain.on('dry-update-database',()=>lkt.commandDryUpdateDatabase());
 
 /* Fill the pannel with the content of the DB.
  * The `arg` is the HTML object of the pannel */
@@ -266,6 +267,9 @@ var currentPlaylist = "";
 ipcMain.on('play-kara-queue-pos', (event, arg) => lkt.commandPlayPos(arg.position));
 ipcMain.on('add-kara-queue-id', (event, arg) => lkt.commandQueueAddId(arg.id));
 ipcMain.on('insert-kara-queue-id', (event, arg) => lkt.commandQueueInsertId(arg.id));
+ipcMain.on('download-kara-id',(event, arg)=>{
+    logger.info("download","download");
+     lkt.commandDownloadId(arg.id)});
 ipcMain.on('delete-kara-queue-pos', (event, arg) => lkt.commandQueueDelPos(arg.position));
 ipcMain.on('add-kara-playlist-id', (event,arg) => {
     if(currentPlaylist != "") {
@@ -431,6 +435,10 @@ ipcMain.on('verify-lektord', (event, arg) => {
                     });
                 }
             }
+            if(lkt.isDBUpdated()) {
+                lkt.setDBUpdated(false);
+                win.webContents.send('check-db-updated');
+            }
         }, 50);
 
         setInterval(() => {
-- 
GitLab