diff --git a/.vscode/launch.json b/.vscode/launch.json index e5cede45eb921ade7637ae8b3ccc16dfe44984c2..1f0e9f28072a1939db4535e34f120141c88c4b05 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,25 +8,18 @@ "name": "Start Engine", "type": "python", "request": "launch", - "program": "${workspaceFolder}/run.py", + "program": "${workspaceFolder}/src/aura_engine/app.py", "console": "integratedTerminal" }, { - "name": "Start Engine Core", + "name": "Recreate Database", "type": "python", "request": "launch", - "program": "${workspaceFolder}/../engine-core/run.py", + "program": "${workspaceFolder}/src/aura_engine/app.py", "args": [ + "--recreate-database" ], "console": "integratedTerminal" - }, - { - "name": "Recreate Database", - "type": "python", - "request": "launch", - "program": "${workspaceFolder}/run.py", - "args": ["--recreate-database"], - "console": "integratedTerminal" } ] } \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index d9e7da76245fabee3a4646909ce39b921ed6dbc3..3e9bd11674c2634330c5a3913944e7b36c7297c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ line-length = 99 target-version = ["py38"] # TODO: Use extend-exclude as soon as Debian Bookworm is released. exclude = ''' - ^/run\.py$ + ^/src/aura_engine/app\.py$ | ^/python/ ''' diff --git a/src/__init__.py b/src/aura_engine/__init__.py similarity index 100% rename from src/__init__.py rename to src/aura_engine/__init__.py diff --git a/run.py b/src/aura_engine/app.py similarity index 87% rename from run.py rename to src/aura_engine/app.py index 19028a662384f4f0136dd1a21dc171709062cf04..46f10f17881bd78474b6311f3298aecb12fbcf6b 100755 --- a/run.py +++ b/src/aura_engine/app.py @@ -19,7 +19,6 @@ import logging -import os import signal import sys import threading @@ -27,16 +26,19 @@ import threading from flask import Flask from flask_sqlalchemy import SQLAlchemy -from src.base.config import AuraConfig -from src.base.logger import AuraLogger -from src.base.utils import SimpleUtil as SU -from src.scheduling.models import DB +from base.config import AuraConfig +from base.logger import AuraLogger +from scheduling.models import DB +from engine import Engine config = AuraConfig() + + def configure_flask(): app.config["SQLALCHEMY_DATABASE_URI"] = config.get_database_uri() - app.config['BABEL_DEFAULT_LOCALE'] = 'de' - app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + app.config["BABEL_DEFAULT_LOCALE"] = "de" + app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False + # FIXME Instantiate SQLAlchemy without the need for Flask app = Flask(__name__) @@ -48,11 +50,11 @@ class EngineRunner: """ EngineRunner is in charge of starting the engine. """ + logger = None config = None engine = None - def __init__(self): """ Constructor @@ -61,22 +63,20 @@ class EngineRunner: AuraLogger(self.config) self.logger = logging.getLogger("AuraEngine") - def run(self): """ Starts Engine Core. """ - from src.engine import Engine - self.engine = Engine() + self.engine = Engine() def recreate_db(self): """ Initializes the database and deletes any existing content. """ - from src.scheduling.models import AuraDatabaseModel - AuraDatabaseModel.recreate_db() + from scheduling.models import AuraDatabaseModel + AuraDatabaseModel.recreate_db() def exit_gracefully(self, signum, frame): """ @@ -92,7 +92,6 @@ class EngineRunner: sys.exit(0) - # # START THE ENGINE # diff --git a/src/base/__init__.py b/src/aura_engine/base/__init__.py similarity index 100% rename from src/base/__init__.py rename to src/aura_engine/base/__init__.py diff --git a/src/base/api.py b/src/aura_engine/base/api.py similarity index 98% rename from src/base/api.py rename to src/aura_engine/base/api.py index 79868a18af0b25755f4162eeb2049402e106f489..5eb11ed9c46a159366497ac9ff249ad1775f1392 100644 --- a/src/base/api.py +++ b/src/aura_engine/base/api.py @@ -22,8 +22,8 @@ import logging import requests -from src.base.utils import DotDict -from src.base.utils import SimpleUtil as SU +from base.utils import DotDict +from base.utils import SimpleUtil as SU class SimpleApi: diff --git a/src/base/config.py b/src/aura_engine/base/config.py similarity index 95% rename from src/base/config.py rename to src/aura_engine/base/config.py index dd13ad5c6fcf1de2abac5a6ef40900016d967525..7a95d6360ae6f0852cc9696041c9753bca075bc1 100644 --- a/src/base/config.py +++ b/src/aura_engine/base/config.py @@ -47,16 +47,19 @@ class AuraConfig: """ self.logger = logging.getLogger("AuraEngine") config_file = Path(ini_path) + project_root = Path(__file__).parent.parent.parent.parent.absolute() + if not config_file.is_file(): - ini_path = "%s/config/engine.ini" % Path(__file__).parent.parent.parent.absolute() + ini_path = f"{project_root}/config/engine.ini" self.ini_path = ini_path self.load_config() AuraConfig.instance = self # Defaults + self.set("install_dir", os.path.realpath(project_root)) self.set("config_dir", os.path.dirname(ini_path)) - self.set("install_dir", os.path.realpath(__file__ + "../../../..")) + print(f"Using configuration at: {ini_path}") @staticmethod def config(): diff --git a/src/base/exceptions.py b/src/aura_engine/base/exceptions.py similarity index 100% rename from src/base/exceptions.py rename to src/aura_engine/base/exceptions.py diff --git a/src/base/logger.py b/src/aura_engine/base/logger.py similarity index 100% rename from src/base/logger.py rename to src/aura_engine/base/logger.py diff --git a/src/base/utils.py b/src/aura_engine/base/utils.py similarity index 100% rename from src/base/utils.py rename to src/aura_engine/base/utils.py diff --git a/src/channels.py b/src/aura_engine/channels.py similarity index 99% rename from src/channels.py rename to src/aura_engine/channels.py index 1a000fbb129f729dae1f44090aeda50af4d789f0..f97f3af3989d231e7ac4956f3e6e698f89df0045 100644 --- a/src/channels.py +++ b/src/aura_engine/channels.py @@ -19,8 +19,8 @@ from enum import Enum -from src.base.utils import SimpleUtil as SU -from src.resources import ResourceType +from base.utils import SimpleUtil as SU +from resources import ResourceType class TransitionType(Enum): diff --git a/src/client/client.py b/src/aura_engine/client/client.py similarity index 98% rename from src/client/client.py rename to src/aura_engine/client/client.py index 64c46c3f3f6d4354e95cd89816a4c9bfed1a494f..c5941e9a05155062d273f64826868eb543212f2d 100644 --- a/src/client/client.py +++ b/src/aura_engine/client/client.py @@ -23,8 +23,8 @@ import socket import urllib.parse from multiprocessing import Lock -from src.base.exceptions import LQConnectionError -from src.base.utils import TerminalColors +from base.exceptions import LQConnectionError +from base.utils import TerminalColors class LiquidSoapClient: diff --git a/src/client/connector.py b/src/aura_engine/client/connector.py similarity index 97% rename from src/client/connector.py rename to src/aura_engine/client/connector.py index bd479931ac2d3be776dca52f999077ec07fa7bfb..506400e138fbd5915b5111e9baf29413353bb1a0 100644 --- a/src/client/connector.py +++ b/src/aura_engine/client/connector.py @@ -20,11 +20,11 @@ import logging import time -from src.base.config import AuraConfig -from src.base.exceptions import LQConnectionError -from src.base.utils import SimpleUtil as SU -from src.base.utils import TerminalColors -from src.client.playerclient import LiquidSoapPlayerClient +from base.config import AuraConfig +from base.exceptions import LQConnectionError +from base.utils import SimpleUtil as SU +from base.utils import TerminalColors +from client.playerclient import LiquidSoapPlayerClient class PlayerConnector: diff --git a/src/client/playerclient.py b/src/aura_engine/client/playerclient.py similarity index 99% rename from src/client/playerclient.py rename to src/aura_engine/client/playerclient.py index 825a4632720b01d9700192c79355adb1d849a606..7b3c97872115c7eab44375e1cd7f7c68848d54de 100644 --- a/src/client/playerclient.py +++ b/src/aura_engine/client/playerclient.py @@ -17,7 +17,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. -from src.client.client import LiquidSoapClient +from client.client import LiquidSoapClient class LiquidSoapPlayerClient(LiquidSoapClient): diff --git a/src/control.py b/src/aura_engine/control.py similarity index 98% rename from src/control.py rename to src/aura_engine/control.py index bfd94cb8d9e4a429a2f93fb631b47e01698f40c9..b99e7018aedc0989e73f4c3a57137e22fb6816b3 100644 --- a/src/control.py +++ b/src/aura_engine/control.py @@ -27,9 +27,9 @@ from threading import Lock, Thread, Timer from http_parser.http import HttpStream from http_parser.reader import SocketReader -from src.base.api import LiquidsoapUtil as LU -from src.base.config import AuraConfig -from src.base.utils import SimpleUtil as SU +from base.api import LiquidsoapUtil as LU +from base.config import AuraConfig +from base.utils import SimpleUtil as SU class EngineControlInterface: @@ -230,7 +230,7 @@ class EngineExecutor(Timer): param (object): Parameter passt to the function """ self._lock = Lock() - from src.engine import Engine + from engine import Engine now_unix = Engine.engine_time() diff --git a/src/engine.py b/src/aura_engine/engine.py similarity index 98% rename from src/engine.py rename to src/aura_engine/engine.py index 7a0938f81ec8f6a58004609ac0370047a6628585..2c40bca8394b0a2481e0319e09317e815d5e8c37 100644 --- a/src/engine.py +++ b/src/aura_engine/engine.py @@ -24,17 +24,17 @@ from contextlib import suppress from threading import Thread import meta -from src.base.api import LiquidsoapUtil as LU -from src.base.config import AuraConfig -from src.base.exceptions import ( +from base.api import LiquidsoapUtil as LU +from base.config import AuraConfig +from base.exceptions import ( InvalidChannelException, LoadSourceException, LQConnectionError, LQStreamException, ) -from src.base.utils import DotDict -from src.base.utils import SimpleUtil as SU -from src.channels import ( +from base.utils import DotDict +from base.utils import SimpleUtil as SU +from channels import ( Channel, ChannelResolver, ChannelRouter, @@ -44,11 +44,11 @@ from src.channels import ( ResourceType, TransitionType, ) -from src.client.connector import PlayerConnector -from src.control import EngineControlInterface -from src.events import EngineEventDispatcher -from src.mixer import Mixer, MixerType -from src.resources import ResourceClass, ResourceUtil +from client.connector import PlayerConnector +from control import EngineControlInterface +from events import EngineEventDispatcher +from mixer import Mixer, MixerType +from resources import ResourceClass, ResourceUtil class Engine: diff --git a/src/events.py b/src/aura_engine/events.py similarity index 97% rename from src/events.py rename to src/aura_engine/events.py index 8457fffe561a35df63c1b458405159528fade985..086647478dbd26a9bb88c7bac78832948a68a137 100644 --- a/src/events.py +++ b/src/aura_engine/events.py @@ -21,10 +21,10 @@ import datetime import logging from threading import Thread -from src.base.config import AuraConfig -from src.plugins.clock import ClockInfoHandler -from src.plugins.mailer import AuraMailer -from src.plugins.monitor import AuraMonitor +from base.config import AuraConfig +from plugins.clock import ClockInfoHandler +from plugins.mailer import AuraMailer +from plugins.monitor import AuraMonitor class EventBinding: @@ -147,7 +147,7 @@ class EngineEventDispatcher: Important: Subsequent events are called synchronously, hence blocking. """ self.logger.debug("on_initialized(..)") - from src.scheduling.scheduler import AuraScheduler + from scheduling.scheduler import AuraScheduler self.scheduler = AuraScheduler(self.engine) self.call_event("on_initialized", None) diff --git a/meta.py b/src/aura_engine/meta.py similarity index 100% rename from meta.py rename to src/aura_engine/meta.py diff --git a/src/mixer.py b/src/aura_engine/mixer.py similarity index 99% rename from src/mixer.py rename to src/aura_engine/mixer.py index df7d7a9e51e0b9f616ba38bdfb909f83149da160..04e6c1d537f4289de73d45c501ec4aa258f5f74a 100644 --- a/src/mixer.py +++ b/src/aura_engine/mixer.py @@ -21,9 +21,9 @@ import logging import time from enum import Enum -from src.base.api import LiquidsoapUtil as LU -from src.base.exceptions import LQConnectionError -from src.base.utils import SimpleUtil as SU +from base.api import LiquidsoapUtil as LU +from base.exceptions import LQConnectionError +from base.utils import SimpleUtil as SU class MixerType(Enum): diff --git a/src/plugins/__init__.py b/src/aura_engine/plugins/__init__.py similarity index 100% rename from src/plugins/__init__.py rename to src/aura_engine/plugins/__init__.py diff --git a/src/plugins/clock.py b/src/aura_engine/plugins/clock.py similarity index 97% rename from src/plugins/clock.py rename to src/aura_engine/plugins/clock.py index 5f82b10ad2019837a990cbfdea861d4dfd900ff5..2838c7d2ec7741768a0d1f1fea0c0d0863c9cb4e 100644 --- a/src/plugins/clock.py +++ b/src/aura_engine/plugins/clock.py @@ -20,10 +20,10 @@ import logging from datetime import datetime, timedelta -from src.base.api import SimpleApi -from src.base.config import AuraConfig -from src.base.utils import DotDict -from src.resources import ResourceUtil +from base.api import SimpleApi +from base.config import AuraConfig +from base.utils import DotDict +from resources import ResourceUtil class ClockInfoHandler: diff --git a/src/plugins/mailer.py b/src/aura_engine/plugins/mailer.py similarity index 98% rename from src/plugins/mailer.py rename to src/aura_engine/plugins/mailer.py index d36d7f384530ca4fb75c496329ac706482527161..e3b07a2a1c7125b720bf846120105b2dc67e14fa 100644 --- a/src/plugins/mailer.py +++ b/src/aura_engine/plugins/mailer.py @@ -21,8 +21,8 @@ import logging import smtplib from email.message import EmailMessage -from src.base.config import AuraConfig -from src.base.utils import SimpleUtil as SU +from base.config import AuraConfig +from base.utils import SimpleUtil as SU class MailingException(Exception): diff --git a/src/plugins/monitor.py b/src/aura_engine/plugins/monitor.py similarity index 99% rename from src/plugins/monitor.py rename to src/aura_engine/plugins/monitor.py index 99cd0076c64f4eb63cd0717f6d333909a86c198c..4de7c79bcedb7980e83a526f5b3c502d31331598 100644 --- a/src/plugins/monitor.py +++ b/src/aura_engine/plugins/monitor.py @@ -30,8 +30,8 @@ from socket import AF_INET, SO_BROADCAST, SOCK_DGRAM, SOL_SOCKET, socket import requests import meta -from src.base.config import AuraConfig -from src.base.utils import SimpleUtil as SU +from base.config import AuraConfig +from base.utils import SimpleUtil as SU # Exceptions diff --git a/src/resources.py b/src/aura_engine/resources.py similarity index 100% rename from src/resources.py rename to src/aura_engine/resources.py diff --git a/src/scheduling/__init__.py b/src/aura_engine/scheduling/__init__.py similarity index 100% rename from src/scheduling/__init__.py rename to src/aura_engine/scheduling/__init__.py diff --git a/src/scheduling/api.py b/src/aura_engine/scheduling/api.py similarity index 99% rename from src/scheduling/api.py rename to src/aura_engine/scheduling/api.py index 2bec6bbd7a9c56c81bef7d8b285a801742c376c3..80c5cc5330ba3cad51b90da8c2cbb5ab9f64b8dc 100644 --- a/src/scheduling/api.py +++ b/src/aura_engine/scheduling/api.py @@ -23,8 +23,8 @@ import threading import requests -from src.base.utils import SimpleUtil as SU -from src.scheduling.utils import TimeslotFilter +from base.utils import SimpleUtil as SU +from scheduling.utils import TimeslotFilter class ApiFetcher(threading.Thread): diff --git a/src/scheduling/models.py b/src/aura_engine/scheduling/models.py similarity index 99% rename from src/scheduling/models.py rename to src/aura_engine/scheduling/models.py index cc64b1345c12ea4a5f0e8294890a3dbcbf721b92..67ae10f56b4c5b59f7b5ef7a74d2bcf17cc0d8c9 100644 --- a/src/scheduling/models.py +++ b/src/aura_engine/scheduling/models.py @@ -37,9 +37,9 @@ from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm import relationship -from src.base.config import AuraConfig -from src.base.utils import SimpleUtil -from src.resources import ResourceUtil +from base.config import AuraConfig +from base.utils import SimpleUtil +from resources import ResourceUtil # Initialize DB Model and session config = AuraConfig() diff --git a/src/scheduling/programme.py b/src/aura_engine/scheduling/programme.py similarity index 98% rename from src/scheduling/programme.py rename to src/aura_engine/scheduling/programme.py index a5cc41df4678507c76a792f557d24d7a043ef309..acce07620844c7c63f72bd73b49da76034e9f183 100644 --- a/src/scheduling/programme.py +++ b/src/aura_engine/scheduling/programme.py @@ -20,17 +20,17 @@ import logging from datetime import datetime -from src.base.config import AuraConfig -from src.base.utils import SimpleUtil as SU -from src.engine import Engine -from src.scheduling.api import ApiFetcher -from src.scheduling.models import ( +from base.config import AuraConfig +from base.utils import SimpleUtil as SU +from engine import Engine +from scheduling.api import ApiFetcher +from scheduling.models import ( Playlist, PlaylistEntry, PlaylistEntryMetaData, Timeslot, ) -from src.scheduling.utils import M3UPlaylistProcessor +from scheduling.utils import M3UPlaylistProcessor class ProgrammeService: diff --git a/src/scheduling/scheduler.py b/src/aura_engine/scheduling/scheduler.py similarity index 97% rename from src/scheduling/scheduler.py rename to src/aura_engine/scheduling/scheduler.py index 350b481c411b8cfe376175f3e32cb419b3eecb24..580cf9622f1bc00bf977596a8ef77c3bfae5c3c8 100644 --- a/src/scheduling/scheduler.py +++ b/src/aura_engine/scheduling/scheduler.py @@ -21,16 +21,16 @@ import logging import threading import time -from src.base.config import AuraConfig -from src.base.exceptions import LoadSourceException, NoActiveTimeslotException -from src.base.utils import SimpleUtil as SU -from src.channels import ChannelType, EntryPlayState, TransitionType -from src.control import EngineExecutor -from src.engine import Engine -from src.resources import ResourceClass, ResourceUtil -from src.scheduling.models import AuraDatabaseModel -from src.scheduling.programme import ProgrammeService -from src.scheduling.utils import TimeslotRenderer +from base.config import AuraConfig +from base.exceptions import LoadSourceException, NoActiveTimeslotException +from base.utils import SimpleUtil as SU +from channels import ChannelType, EntryPlayState, TransitionType +from control import EngineExecutor +from engine import Engine +from resources import ResourceClass, ResourceUtil +from scheduling.models import AuraDatabaseModel +from scheduling.programme import ProgrammeService +from scheduling.utils import TimeslotRenderer class AuraScheduler(threading.Thread): diff --git a/src/scheduling/utils.py b/src/aura_engine/scheduling/utils.py similarity index 99% rename from src/scheduling/utils.py rename to src/aura_engine/scheduling/utils.py index 1317cc25101b7d26cde8326c1422108b94ba5930..058c48e04aefe8dec887862930a9623e7c84f5bc 100644 --- a/src/scheduling/utils.py +++ b/src/aura_engine/scheduling/utils.py @@ -21,8 +21,8 @@ import logging from datetime import datetime from enum import Enum -from src.base.config import AuraConfig -from src.base.utils import SimpleUtil as SU +from base.config import AuraConfig +from base.utils import SimpleUtil as SU class EntryQueueState(Enum):