mirror of
https://gitlab.com/RemixDev/deemix-gui-pyweb.git
synced 2024-12-28 02:16:16 +00:00
Merge pull request 'Updated pyweb to use library version 1.2.0' (#11) from dev into main
Reviewed-on: https://codeberg.org/RemixDev/deemix-pyweb/pulls/11
This commit is contained in:
commit
018aa975bd
317
app.py
317
app.py
|
@ -1,204 +1,171 @@
|
|||
#!/usr/bin/env python3
|
||||
from deemix.app.queuemanager import addToQueue, removeFromQueue, getQueue, cancelAllDownloads, removeFinishedDownloads, restoreQueue, slimQueueItems, resetQueueItems
|
||||
from deemix.api.deezer import Deezer
|
||||
from deemix.app.settings import Settings
|
||||
from deemix.app.queuemanager import QueueManager
|
||||
from deemix.app.spotifyhelper import SpotifyHelper, emptyPlaylist as emptySpotifyPlaylist
|
||||
|
||||
from deemix.utils.misc import getTypeFromLink, getIDFromLink
|
||||
from deemix.app.settings import initSettings, getSettings, getDefaultSettings, saveSettings
|
||||
from deemix.app.spotify import SpotifyHelper
|
||||
from deemix.utils.localpaths import getConfigFolder
|
||||
|
||||
#from deemix.app.queuemanager import addToQueue, removeFromQueue, getQueue, cancelAllDownloads, removeFinishedDownloads, restoreQueue, slimQueueItems, resetQueueItems
|
||||
#
|
||||
#from deemix.app.settings import initSettings, getSettings, getDefaultSettings, saveSettings
|
||||
#from deemix.app.spotify import SpotifyHelper
|
||||
#
|
||||
|
||||
import os.path as path
|
||||
import json
|
||||
from os import remove
|
||||
|
||||
settings = {}
|
||||
spotifyHelper = None
|
||||
chartsList = []
|
||||
configFolder = ""
|
||||
|
||||
|
||||
def initialize(portable):
|
||||
global settings
|
||||
global spotifyHelper
|
||||
global defaultSettings
|
||||
global configFolder
|
||||
if portable:
|
||||
configFolder = portable
|
||||
else:
|
||||
configFolder = getConfigFolder()
|
||||
settings = initSettings(configFolder=configFolder)
|
||||
defaultSettings = getDefaultSettings()
|
||||
spotifyHelper = SpotifyHelper(configFolder=configFolder)
|
||||
class deemix:
|
||||
def __init__(self, portable):
|
||||
self.configFolder = portable
|
||||
if not portable:
|
||||
self.configFolder = getConfigFolder()
|
||||
self.set = Settings(self.configFolder)
|
||||
self.sp = SpotifyHelper(self.configFolder)
|
||||
self.qm = QueueManager()
|
||||
|
||||
self.chartsList = []
|
||||
|
||||
def shutdown(interface=None):
|
||||
global configFolder
|
||||
if settings['saveDownloadQueue']:
|
||||
(queue, queueComplete, queueList, currentItem) = getQueue()
|
||||
if len(queueList) > 0:
|
||||
if currentItem != "":
|
||||
queue.insert(0, currentItem)
|
||||
with open(path.join(configFolder, 'queue.json'), 'w') as f:
|
||||
json.dump({
|
||||
'queue': queue,
|
||||
'queueComplete': queueComplete,
|
||||
'queueList': resetQueueItems(queueList, queue)
|
||||
}, f)
|
||||
cancelAllDownloads(interface)
|
||||
if interface:
|
||||
interface.send("toast", {'msg': "Server is closed."})
|
||||
|
||||
def loadDownloadQueue(dz, interface=None):
|
||||
global configFolder
|
||||
if path.isfile(path.join(configFolder, 'queue.json')):
|
||||
def shutdown(self, interface=None):
|
||||
if self.set.settings['saveDownloadQueue']:
|
||||
self.qm.saveQueue(self.configFolder)
|
||||
self.qm.cancelAllDownloads(interface)
|
||||
if interface:
|
||||
interface.send('toast', {'msg': "Restoring download queue", 'icon': 'loading', 'dismiss': False,
|
||||
'id': 'restoring_queue'})
|
||||
with open(path.join(configFolder, 'queue.json'), 'r') as f:
|
||||
qd = json.load(f)
|
||||
if interface:
|
||||
interface.send('init_downloadQueue',
|
||||
{'queue': qd['queue'], 'queueComplete': qd['queueComplete'], 'queueList': slimQueueItems(qd['queueList'])})
|
||||
if interface:
|
||||
interface.send('toast', {'msg': "Download queue restored!", 'icon': 'done', 'dismiss': True,
|
||||
'id': 'restoring_queue'})
|
||||
remove(path.join(configFolder, 'queue.json'))
|
||||
restoreQueue(qd['queue'], qd['queueComplete'], qd['queueList'], dz, interface)
|
||||
interface.send("toast", {'msg': "Server is closed."})
|
||||
|
||||
def getDownloadFolder():
|
||||
global settings
|
||||
return settings['downloadLocation']
|
||||
def restoreDownloadQueue(self, dz, interface=None):
|
||||
self.qm.loadQueue(self.configFolder, self.set.settings, interface)
|
||||
|
||||
def get_charts(dz):
|
||||
global chartsList
|
||||
if len(chartsList) == 0:
|
||||
temp = dz.get_charts_countries()
|
||||
countries = []
|
||||
for i in range(len(temp)):
|
||||
countries.append({
|
||||
'title': temp[i]['title'].replace("Top ", ""),
|
||||
'id': temp[i]['id'],
|
||||
'picture_small': temp[i]['picture_small'],
|
||||
'picture_medium': temp[i]['picture_medium'],
|
||||
'picture_big': temp[i]['picture_big']
|
||||
})
|
||||
chartsList = countries
|
||||
return chartsList
|
||||
def queueRestored(self, dz, interface=None):
|
||||
self.qm.nextItem(dz, self.sp, interface)
|
||||
|
||||
def getUserFavorites(dz):
|
||||
user_id = dz.user['id']
|
||||
result = {}
|
||||
try:
|
||||
result['playlists'] = dz.get_user_playlists(user_id)['data']
|
||||
result['albums'] = dz.get_user_albums(user_id)['data']
|
||||
result['artists'] = dz.get_user_artists(user_id)['data']
|
||||
result['tracks'] = dz.get_user_tracks(user_id)['data']
|
||||
except:
|
||||
result['playlists'] = dz.get_user_playlists_gw(user_id)
|
||||
result['albums'] = dz.get_user_albums_gw(user_id)
|
||||
result['artists'] = dz.get_user_artists_gw(user_id)
|
||||
result['tracks'] = dz.get_user_tracks_gw(user_id)
|
||||
return result
|
||||
def get_charts(self, dz):
|
||||
if len(self.chartsList) == 0:
|
||||
temp = dz.get_charts_countries()
|
||||
countries = []
|
||||
for i in range(len(temp)):
|
||||
countries.append({
|
||||
'title': temp[i]['title'].replace("Top ", ""),
|
||||
'id': temp[i]['id'],
|
||||
'picture_small': temp[i]['picture_small'],
|
||||
'picture_medium': temp[i]['picture_medium'],
|
||||
'picture_big': temp[i]['picture_big']
|
||||
})
|
||||
self.chartsList = countries
|
||||
return self.chartsList
|
||||
|
||||
def updateUserSpotifyPlaylists(user):
|
||||
if user == "" or not spotifyHelper.spotifyEnabled:
|
||||
return []
|
||||
try:
|
||||
return spotifyHelper.get_user_playlists(user)
|
||||
except:
|
||||
return []
|
||||
def getDownloadFolder(self):
|
||||
return self.set.settings['downloadLocation']
|
||||
|
||||
def getUserFavorites(self, dz):
|
||||
user_id = dz.user['id']
|
||||
result = {}
|
||||
try:
|
||||
result['playlists'] = dz.get_user_playlists(user_id)['data']
|
||||
result['albums'] = dz.get_user_albums(user_id)['data']
|
||||
result['artists'] = dz.get_user_artists(user_id)['data']
|
||||
result['tracks'] = dz.get_user_tracks(user_id)['data']
|
||||
except:
|
||||
result['playlists'] = dz.get_user_playlists_gw(user_id)
|
||||
result['albums'] = dz.get_user_albums_gw(user_id)
|
||||
result['artists'] = dz.get_user_artists_gw(user_id)
|
||||
result['tracks'] = dz.get_user_tracks_gw(user_id)
|
||||
return result
|
||||
|
||||
def updateUserSpotifyPlaylists(self, user):
|
||||
if user == "" or not self.sp.spotifyEnabled:
|
||||
return []
|
||||
try:
|
||||
return self.sp.get_user_playlists(user)
|
||||
except:
|
||||
return []
|
||||
|
||||
def updateUserPlaylists(self, dz):
|
||||
user_id = dz.user['id']
|
||||
try:
|
||||
return dz.get_user_playlists(user_id)['data']
|
||||
except:
|
||||
return dz.get_user_playlists_gw(user_id)
|
||||
|
||||
def updateUserAlbums(self, dz):
|
||||
user_id = dz.user['id']
|
||||
try:
|
||||
return dz.get_user_albums(user_id)['data']
|
||||
except:
|
||||
return dz.get_user_albums_gw(user_id)
|
||||
|
||||
def updateUserArtists(self, dz):
|
||||
user_id = dz.user['id']
|
||||
try:
|
||||
return dz.get_user_artists(user_id)['data']
|
||||
except:
|
||||
return dz.get_user_artists_gw(user_id)
|
||||
|
||||
def updateUserTracks(self, dz):
|
||||
user_id = dz.user['id']
|
||||
try:
|
||||
return dz.get_user_tracks(user_id)['data']
|
||||
except:
|
||||
return dz.get_user_tracks_gw(user_id)
|
||||
|
||||
def getSpotifyPlaylistTracklist(self, id):
|
||||
if id == "" or not self.sp.spotifyEnabled:
|
||||
return emptySpotifyPlaylist
|
||||
return self.sp.get_playlist_tracklist(id)
|
||||
|
||||
# Search functions
|
||||
def mainSearch(self, dz, term):
|
||||
return dz.search_main_gw(term)
|
||||
|
||||
def search(self, dz, term, type, start, nb):
|
||||
return dz.search(term, type, nb, start)
|
||||
|
||||
# Queue functions
|
||||
def addToQueue(self, dz, url, bitrate=None, interface=None):
|
||||
if ';' in url:
|
||||
url = url.split(";")
|
||||
self.qm.addToQueue(dz, self.sp, url, self.set.settings, bitrate, interface)
|
||||
|
||||
|
||||
def updateUserPlaylists(dz):
|
||||
user_id = dz.user['id']
|
||||
try:
|
||||
return dz.get_user_playlists(user_id)['data']
|
||||
except:
|
||||
return dz.get_user_playlists_gw(user_id)
|
||||
|
||||
def updateUserAlbums(dz):
|
||||
user_id = dz.user['id']
|
||||
try:
|
||||
return dz.get_user_albums(user_id)['data']
|
||||
except:
|
||||
return dz.get_user_albums_gw(user_id)
|
||||
|
||||
def updateUserArtists(dz):
|
||||
user_id = dz.user['id']
|
||||
try:
|
||||
return dz.get_user_artists(user_id)['data']
|
||||
except:
|
||||
return dz.get_user_artists_gw(user_id)
|
||||
|
||||
def updateUserTracks(dz):
|
||||
user_id = dz.user['id']
|
||||
try:
|
||||
return dz.get_user_tracks(user_id)['data']
|
||||
except:
|
||||
return dz.get_user_tracks_gw(user_id)
|
||||
|
||||
def getSpotifyPlaylistTracklist(id):
|
||||
if id == "" or not spotifyHelper.spotifyEnabled:
|
||||
return spotifyHelper.emptyPlaylist
|
||||
return spotifyHelper.get_playlist_tracklist(id)
|
||||
|
||||
# Search functions
|
||||
def mainSearch(dz, term):
|
||||
return dz.search_main_gw(term)
|
||||
def removeFromQueue(self, uuid, interface=None):
|
||||
self.qm.removeFromQueue(uuid, interface)
|
||||
|
||||
|
||||
def search(dz, term, type, start, nb):
|
||||
return dz.search(term, type, nb, start)
|
||||
def cancelAllDownloads(self, interface=None):
|
||||
self.qm.cancelAllDownloads(interface)
|
||||
|
||||
|
||||
# Queue functions
|
||||
def addToQueue_link(dz, url, bitrate=None, interface=None):
|
||||
if ';' in url:
|
||||
url = url.split(";")
|
||||
return addToQueue(dz, spotifyHelper, url, settings, bitrate, interface)
|
||||
def removeFinishedDownloads(self, interface=None):
|
||||
self.qm.removeFinishedDownloads(interface)
|
||||
|
||||
|
||||
def removeFromQueue_link(uuid, interface=None):
|
||||
removeFromQueue(uuid, interface)
|
||||
def initDownloadQueue(self):
|
||||
(queue, queueComplete, queueList, currentItem) = self.qm.getQueue()
|
||||
return (queue, queueComplete, queueList, currentItem)
|
||||
|
||||
def analyzeLink(self, dz, link):
|
||||
type = getTypeFromLink(link)
|
||||
relID = getIDFromLink(link, type)
|
||||
if type in ["track", "album"]:
|
||||
data = getattr(dz, 'get_' + type)(relID)
|
||||
else:
|
||||
data = {}
|
||||
return (type, data)
|
||||
|
||||
def cancelAllDownloads_link(interface=None):
|
||||
cancelAllDownloads(interface)
|
||||
# Settings functions
|
||||
def getDefaultSettings(self):
|
||||
return self.set.defaultSettings
|
||||
|
||||
def getSettings(self):
|
||||
return self.set.settings
|
||||
|
||||
def removeFinishedDownloads_link(interface=None):
|
||||
removeFinishedDownloads(interface)
|
||||
def saveSettings(self, newSettings):
|
||||
return self.set.saveSettings(newSettings)
|
||||
|
||||
def getSpotifyCredentials(self):
|
||||
return self.sp.getCredentials()
|
||||
|
||||
def initDownloadQueue():
|
||||
(queue, queueComplete, queueList, currentItem) = getQueue()
|
||||
return (queue, queueComplete, slimQueueItems(queueList), currentItem)
|
||||
|
||||
def analyzeLink(dz, link):
|
||||
type = getTypeFromLink(link)
|
||||
relID = getIDFromLink(link, type)
|
||||
if type in ["track", "album"]:
|
||||
data = getattr(dz, 'get_' + type)(relID)
|
||||
else:
|
||||
data = {}
|
||||
return (type, data)
|
||||
|
||||
# Settings functions
|
||||
def getDefaultSettings_link():
|
||||
return defaultSettings
|
||||
|
||||
|
||||
def getSettings_link():
|
||||
return getSettings()
|
||||
|
||||
|
||||
def saveSettings_link(newSettings):
|
||||
global settings
|
||||
settings = newSettings
|
||||
return saveSettings(newSettings)
|
||||
|
||||
|
||||
def getSpotifyCredentials():
|
||||
return spotifyHelper.getCredentials()
|
||||
|
||||
|
||||
def setSpotifyCredentials(newCredentials):
|
||||
return spotifyHelper.setCredentials(newCredentials)
|
||||
def setSpotifyCredentials(self, newCredentials):
|
||||
return self.sp.setCredentials(newCredentials)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
deemix>=1.1.28
|
||||
deemix>=1.2.0
|
||||
flask
|
||||
flask-socketio
|
||||
pywebview>=3.3.2
|
||||
|
|
41
server.py
41
server.py
|
@ -9,9 +9,9 @@ from flask import Flask, render_template, request, session, redirect, copy_curre
|
|||
from flask_socketio import SocketIO, emit
|
||||
from werkzeug.middleware.proxy_fix import ProxyFix
|
||||
|
||||
import app
|
||||
from app import deemix
|
||||
from deemix.api.deezer import Deezer
|
||||
from deemix.app.MessageInterface import MessageInterface
|
||||
from deemix.app.messageinterface import MessageInterface
|
||||
|
||||
# Workaround for MIME type error in certain Windows installs
|
||||
# https://github.com/pallets/flask/issues/1045#issuecomment-42202749
|
||||
|
@ -24,6 +24,8 @@ mimetypes.add_type('text/javascript', '.js')
|
|||
from engineio.payload import Payload
|
||||
Payload.max_decode_packets = 500
|
||||
|
||||
app = None
|
||||
|
||||
class CustomFlask(Flask):
|
||||
jinja_options = Flask.jinja_options.copy()
|
||||
jinja_options.update(dict(
|
||||
|
@ -82,7 +84,7 @@ def not_found_handler(e):
|
|||
def closing():
|
||||
app.shutdown(interface=socket_interface)
|
||||
socketio.stop()
|
||||
return 'server closed'
|
||||
return 'Server Closed'
|
||||
|
||||
serverwide_arl = "--serverwide-arl" in sys.argv
|
||||
if serverwide_arl:
|
||||
|
@ -91,9 +93,9 @@ if serverwide_arl:
|
|||
@socketio.on('connect')
|
||||
def on_connect():
|
||||
session['dz'] = Deezer()
|
||||
settings = app.getSettings_link()
|
||||
settings = app.getSettings()
|
||||
spotifyCredentials = app.getSpotifyCredentials()
|
||||
defaultSettings = app.getDefaultSettings_link()
|
||||
defaultSettings = app.getDefaultSettings()
|
||||
emit('init_settings', (settings, spotifyCredentials, defaultSettings))
|
||||
emit('init_autologin')
|
||||
|
||||
|
@ -104,8 +106,13 @@ def on_connect():
|
|||
login(arl)
|
||||
|
||||
queue, queueComplete, queueList, currentItem = app.initDownloadQueue()
|
||||
emit('init_downloadQueue',
|
||||
{'queue': queue, 'queueComplete': queueComplete, 'queueList': queueList, 'currentItem': currentItem})
|
||||
if len(queueList.keys()):
|
||||
emit('init_downloadQueue',{
|
||||
'queue': queue,
|
||||
'queueComplete': queueComplete,
|
||||
'queueList': queueList,
|
||||
'currentItem': currentItem
|
||||
})
|
||||
emit('init_home', session['dz'].get_charts())
|
||||
emit('init_charts', app.get_charts(session['dz']))
|
||||
|
||||
|
@ -130,7 +137,7 @@ def login(arl, force=False, child=0):
|
|||
emit('logged_in', {'status': result, 'arl': arl, 'user': session['dz'].user})
|
||||
if firstConnection and result in [1, 3]:
|
||||
firstConnection = False
|
||||
app.loadDownloadQueue(session['dz'], socket_interface)
|
||||
app.restoreDownloadQueue(session['dz'], socket_interface)
|
||||
if result != 0:
|
||||
emit('familyAccounts', session['dz'].childs)
|
||||
emit('init_favorites', app.getUserFavorites(session['dz']))
|
||||
|
@ -167,31 +174,36 @@ def search(data):
|
|||
emit('search', result)
|
||||
|
||||
|
||||
@socketio.on('queueRestored')
|
||||
def queueRestored():
|
||||
app.queueRestored(session['dz'], socket_interface)
|
||||
|
||||
|
||||
@socketio.on('addToQueue')
|
||||
def addToQueue(data):
|
||||
result = app.addToQueue_link(session['dz'], data['url'], data['bitrate'], interface=socket_interface)
|
||||
result = app.addToQueue(session['dz'], data['url'], data['bitrate'], interface=socket_interface)
|
||||
if result == "Not logged in":
|
||||
emit('loginNeededToDownload')
|
||||
|
||||
|
||||
@socketio.on('removeFromQueue')
|
||||
def removeFromQueue(uuid):
|
||||
app.removeFromQueue_link(uuid, interface=socket_interface)
|
||||
app.removeFromQueue(uuid, interface=socket_interface)
|
||||
|
||||
|
||||
@socketio.on('removeFinishedDownloads')
|
||||
def removeFinishedDownloads():
|
||||
app.removeFinishedDownloads_link(interface=socket_interface)
|
||||
app.removeFinishedDownloads(interface=socket_interface)
|
||||
|
||||
|
||||
@socketio.on('cancelAllDownloads')
|
||||
def cancelAllDownloads():
|
||||
app.cancelAllDownloads_link(interface=socket_interface)
|
||||
app.cancelAllDownloads(interface=socket_interface)
|
||||
|
||||
|
||||
@socketio.on('saveSettings')
|
||||
def saveSettings(settings, spotifyCredentials, spotifyUser):
|
||||
app.saveSettings_link(settings)
|
||||
app.saveSettings(settings)
|
||||
app.setSpotifyCredentials(spotifyCredentials)
|
||||
socketio.emit('updateSettings', (settings, spotifyCredentials))
|
||||
if spotifyUser != False:
|
||||
|
@ -327,7 +339,8 @@ def applogin():
|
|||
print("Can't open folder selection, you're not running pywebview")
|
||||
|
||||
def run_server(port, host="127.0.0.1", portable=None):
|
||||
app.initialize(portable)
|
||||
global app
|
||||
app = deemix(portable)
|
||||
print("Starting server at http://" + host + ":" + str(port))
|
||||
socketio.run(server, host=host, port=port)
|
||||
|
||||
|
|
2
webui
2
webui
|
@ -1 +1 @@
|
|||
Subproject commit 26d68a9e41d11df1011ea7f06a870d004a336c51
|
||||
Subproject commit 6c72c1fb2fd48a3e847c5c7cfbd59fc75f071ae3
|
Loading…
Reference in a new issue