Added base code for settings

This commit is contained in:
Manuel Cortez 2019-06-17 06:01:55 -05:00
parent 26f2da1e6d
commit 0447974029
9 changed files with 139 additions and 18 deletions

View File

@ -1,8 +1,13 @@
[main] [main]
volume = integer(default=50) volume = integer(default=50)
language = string(default="system")
[services] [services]
[[tidal]] [[tidal]]
username = string(default="") username = string(default="")
password = string(default="") password = string(default="")
quality=string(default="lossless") quality=string(default="lossless")
[[youtube]]
transcode = boolean(default=True)

View File

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
import config
from utils import get_extractors
from wxUI.configuration import configurationDialog
class configuration(object):
def __init__(self):
self.view = configurationDialog(_("Settings"))
self.create_config()
self.view.get_response()
self.save()
def create_config(self):
self.view.create_general()
extractors = get_extractors()
for i in extractors:
print(i)
if hasattr(i, "settings"):
panel = getattr(i, "settings")(self.view.notebook)
self.view.notebook.AddPage(panel, panel.name)
panel.load()
self.view.realize()
def save(self):
for i in range(0, self.view.notebook.GetPageCount()):
page = self.view.notebook.GetPage(i)
if hasattr(page, "save"):
page.save()
config.app.write()

View File

@ -13,17 +13,11 @@ from pubsub import pub
from issueReporter import issueReporter from issueReporter import issueReporter
from wxUI import mainWindow, menus from wxUI import mainWindow, menus
from update import updater from update import updater
from . import player from utils import get_extractors
from . import player, configuration
log = logging.getLogger("controller.main") log = logging.getLogger("controller.main")
def get_extractors():
""" Function for importing everything wich is located in the extractors package and has a class named interface."""
import extractors
module_type = types.ModuleType
classes = [m.interface for m in extractors.__dict__.values() if type(m) == module_type and hasattr(m, 'interface')]
return sorted(classes, key=lambda c: c.name)
class Controller(object): class Controller(object):
def __init__(self): def __init__(self):
@ -32,7 +26,7 @@ class Controller(object):
# Setting up the player object # Setting up the player object
player.setup() player.setup()
# Get main window # Get main window
self.window = mainWindow.mainWindow(extractors=[i.name for i in get_extractors()]) self.window = mainWindow.mainWindow(extractors=[i.interface.name for i in get_extractors()])
log.debug("Main window created") log.debug("Main window created")
self.window.change_status(_(u"Ready")) self.window.change_status(_(u"Ready"))
# Here we will save results for searches as song objects. # Here we will save results for searches as song objects.
@ -67,6 +61,7 @@ class Controller(object):
widgetUtils.connect_event(self.window.list, widgetUtils.LISTBOX_ITEM_ACTIVATED, self.on_activated) widgetUtils.connect_event(self.window.list, widgetUtils.LISTBOX_ITEM_ACTIVATED, self.on_activated)
widgetUtils.connect_event(self.window.list, widgetUtils.KEYPRESS, self.on_keypress) widgetUtils.connect_event(self.window.list, widgetUtils.KEYPRESS, self.on_keypress)
widgetUtils.connect_event(self.window, widgetUtils.MENU, self.on_play, menuitem=self.window.player_play) widgetUtils.connect_event(self.window, widgetUtils.MENU, self.on_play, menuitem=self.window.player_play)
widgetUtils.connect_event(self.window, widgetUtils.MENU, self.on_settings, menuitem=self.window.settings)
widgetUtils.connect_event(self.window, widgetUtils.MENU, self.on_next, menuitem=self.window.player_next) widgetUtils.connect_event(self.window, widgetUtils.MENU, self.on_next, menuitem=self.window.player_next)
widgetUtils.connect_event(self.window, widgetUtils.MENU, self.on_previous, menuitem=self.window.player_previous) widgetUtils.connect_event(self.window, widgetUtils.MENU, self.on_previous, menuitem=self.window.player_previous)
widgetUtils.connect_event(self.window, widgetUtils.MENU, self.on_stop, menuitem=self.window.player_stop) widgetUtils.connect_event(self.window, widgetUtils.MENU, self.on_stop, menuitem=self.window.player_stop)
@ -95,6 +90,9 @@ class Controller(object):
pub.subscribe(self.on_notify, "notify") pub.subscribe(self.on_notify, "notify")
# Event functions. These functions will call other functions in a thread and are bound to widget events. # Event functions. These functions will call other functions in a thread and are bound to widget events.
def on_settings(self, *args, **kwargs):
settings = configuration.configuration()
def on_search(self, *args, **kwargs): def on_search(self, *args, **kwargs):
wx.CallAfter(self.search) wx.CallAfter(self.search)
@ -246,8 +244,8 @@ class Controller(object):
self.change_status(_(u"Searching {0}... ").format(text)) self.change_status(_(u"Searching {0}... ").format(text))
extractors = get_extractors() extractors = get_extractors()
for i in extractors: for i in extractors:
if extractor == i.name: if extractor == i.interface.name:
self.extractor = i() self.extractor = i.interface()
break break
log.debug("Started search for {0} (selected extractor: {1})".format(text, self.extractor.name)) log.debug("Started search for {0} (selected extractor: {1})".format(text, self.extractor.name))
self.window.list.Clear() self.window.list.Clear()

View File

@ -1,6 +1,10 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: UTF-8 -*- # -*- coding: UTF-8 -*-
from __future__ import unicode_literals # at top of module from __future__ import unicode_literals # at top of module
import logging
import wx
import config
log = logging.getLogger("extractors.config")
class song(object): class song(object):
""" Represents a song in all services. Data will be filled by the service itself""" """ Represents a song in all services. Data will be filled by the service itself"""
@ -21,3 +25,21 @@ class song(object):
def get_download_url(self): def get_download_url(self):
self.download_url = self.extractor.get_download_url(self.url) self.download_url = self.extractor.get_download_url(self.url)
class baseSettings(wx.Panel):
config_section = "base"
def __init__(self, *args, **kwargs):
super(baseSettings, self).__init__(*args, **kwargs)
self.map = []
def save(self):
for i in self.map:
config.app["services"][self.config_section][i[0]] = i[1].GetValue()
def load(self):
for i in self.map:
if i[0] in config.app["services"][self.config_section]:
i[1].SetValue(config.app["services"][self.config_section][i[0]])
else:
log.error("No key available: {key} on extractor {extractor}".format(key=i[0], extractor=self.config_section))

View File

@ -3,10 +3,11 @@ from __future__ import unicode_literals # at top of module
import isodate import isodate
import youtube_dl import youtube_dl
import logging import logging
import wx
from googleapiclient.discovery import build from googleapiclient.discovery import build
from googleapiclient.errors import HttpError from googleapiclient.errors import HttpError
from .import baseFile
from update.utils import seconds_to_string from update.utils import seconds_to_string
from .import baseFile
DEVELOPER_KEY = "AIzaSyCU_hvZJEjLlAGAnlscquKEkE8l0lVOfn0" DEVELOPER_KEY = "AIzaSyCU_hvZJEjLlAGAnlscquKEkE8l0lVOfn0"
YOUTUBE_API_SERVICE_NAME = "youtube" YOUTUBE_API_SERVICE_NAME = "youtube"
@ -102,3 +103,15 @@ class interface(object):
def format_track(self, item): def format_track(self, item):
return "{0} {1}".format(item.title, item.duration) return "{0} {1}".format(item.title, item.duration)
class settings(baseFile.baseSettings):
name = _("Youtube Settings")
config_section = "youtube"
def __init__(self, parent):
super(settings, self).__init__(parent=parent)
sizer = wx.BoxSizer(wx.VERTICAL)
self.transcode = wx.CheckBox(self, wx.NewId(), _("Enable transcode when downloading"))
self.map.append(("transcode", self.transcode))
sizer.Add(self.transcode, 0, wx.ALL, 5)
self.SetSizer(sizer)

View File

@ -3,6 +3,7 @@ import os
import requests import requests
import threading import threading
import logging import logging
import types
from pubsub import pub from pubsub import pub
log = logging.getLogger("utils") log = logging.getLogger("utils")
@ -68,3 +69,10 @@ def download_file(url, local_filename):
pub.sendMessage("download_finished", file=os.path.basename(local_filename)) pub.sendMessage("download_finished", file=os.path.basename(local_filename))
log.debug("Download finished successfully") log.debug("Download finished successfully")
return local_filename return local_filename
def get_extractors():
""" Function for importing everything wich is located in the extractors package and has a class named interface."""
import extractors
module_type = types.ModuleType
classes = [m for m in extractors.__dict__.values() if type(m) == module_type and hasattr(m, 'interface')]
return classes#sorted(classes, key=lambda c: c.name)

44
src/wxUI/configuration.py Normal file
View File

@ -0,0 +1,44 @@
# -*- coding: utf-8 -*-
import wx
import widgetUtils
class general(wx.Panel, widgetUtils.BaseDialog):
def __init__(self, panel):
super(general, self).__init__(panel)
sizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(sizer)
class configurationDialog(widgetUtils.BaseDialog):
def __init__(self, title):
super(configurationDialog, self).__init__(None, -1, title=title)
self.panel = wx.Panel(self)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.notebook = wx.Treebook(self.panel)
def create_general(self):
self.general = general(self.notebook)
self.notebook.AddPage(self.general, _("General"))
self.general.SetFocus()
def realize(self):
self.sizer.Add(self.notebook, 0, wx.ALL, 5)
ok_cancel_box = wx.BoxSizer(wx.HORIZONTAL)
ok = wx.Button(self.panel, wx.ID_OK, _("Save"))
ok.SetDefault()
cancel = wx.Button(self.panel, wx.ID_CANCEL, _("Close"))
self.SetEscapeId(cancel.GetId())
ok_cancel_box.Add(ok, 0, wx.ALL, 5)
ok_cancel_box.Add(cancel, 0, wx.ALL, 5)
self.sizer.Add(ok_cancel_box, 0, wx.ALL, 5)
self.panel.SetSizer(self.sizer)
self.SetClientSize(self.sizer.CalcMin())
def get_value(self, panel, key):
p = getattr(self, panel)
return getattr(p, key).GetValue()
def set_value(self, panel, key, value):
p = getattr(self, panel)
control = getattr(p, key)
getattr(control, "SetValue")(value)

View File

@ -11,8 +11,9 @@ import widgetUtils
class mainWindow(wx.Frame): class mainWindow(wx.Frame):
def makeMenu(self): def makeMenu(self):
mb = wx.MenuBar() mb = wx.MenuBar()
# app_ = wx.Menu() app_ = wx.Menu()
# mb.Append(app_, _(u"Application")) self.settings = app_.Append(wx.NewId(), _("Settings"))
mb.Append(app_, _("Application"))
player = wx.Menu() player = wx.Menu()
self.player_play = player.Append(wx.NewId(), _(u"Play")) self.player_play = player.Append(wx.NewId(), _(u"Play"))
self.player_stop = player.Append(wx.NewId(), _(u"Stop")) self.player_stop = player.Append(wx.NewId(), _(u"Stop"))