diff --git a/.idea/markdown-navigator.xml b/.idea/markdown-navigator.xml new file mode 100644 index 0000000000000000000000000000000000000000..dbe0e4618b151d3e109f0569a3937a16b2f84c54 --- /dev/null +++ b/.idea/markdown-navigator.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="MarkdownProjectSettings"> + <PreviewSettings splitEditorLayout="SPLIT" splitEditorPreview="PREVIEW" useGrayscaleRendering="false" zoomFactor="1.0" maxImageWidth="0" showGitHubPageIfSynced="false" allowBrowsingInPreview="false" synchronizePreviewPosition="true" highlightPreviewType="NONE" highlightFadeOut="5" highlightOnTyping="true" synchronizeSourcePosition="true" verticallyAlignSourceAndPreviewSyncPosition="true" showSearchHighlightsInPreview="false" showSelectionInPreview="true" openRemoteLinks="true"> + <PanelProvider> + <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.panel" providerName="Default - Swing" /> + </PanelProvider> + </PreviewSettings> + <ParserSettings gitHubSyntaxChange="false"> + <PegdownExtensions> + <option name="ABBREVIATIONS" value="false" /> + <option name="ANCHORLINKS" value="true" /> + <option name="ASIDE" value="false" /> + <option name="ATXHEADERSPACE" value="true" /> + <option name="AUTOLINKS" value="true" /> + <option name="DEFINITIONS" value="false" /> + <option name="DEFINITION_BREAK_DOUBLE_BLANK_LINE" value="false" /> + <option name="FENCED_CODE_BLOCKS" value="true" /> + <option name="FOOTNOTES" value="false" /> + <option name="HARDWRAPS" value="false" /> + <option name="HTML_DEEP_PARSER" value="false" /> + <option name="INSERTED" value="false" /> + <option name="QUOTES" value="false" /> + <option name="RELAXEDHRULES" value="true" /> + <option name="SMARTS" value="false" /> + <option name="STRIKETHROUGH" value="true" /> + <option name="SUBSCRIPT" value="false" /> + <option name="SUPERSCRIPT" value="false" /> + <option name="SUPPRESS_HTML_BLOCKS" value="false" /> + <option name="SUPPRESS_INLINE_HTML" value="false" /> + <option name="TABLES" value="true" /> + <option name="TASKLISTITEMS" value="true" /> + <option name="TOC" value="false" /> + <option name="WIKILINKS" value="true" /> + </PegdownExtensions> + <ParserOptions> + <option name="COMMONMARK_LISTS" value="true" /> + <option name="DUMMY" value="false" /> + <option name="EMOJI_SHORTCUTS" value="true" /> + <option name="FLEXMARK_FRONT_MATTER" value="false" /> + <option name="GFM_LOOSE_BLANK_LINE_AFTER_ITEM_PARA" value="false" /> + <option name="GFM_TABLE_RENDERING" value="true" /> + <option name="GITBOOK_URL_ENCODING" value="false" /> + <option name="GITHUB_EMOJI_URL" value="false" /> + <option name="GITHUB_LISTS" value="false" /> + <option name="GITHUB_WIKI_LINKS" value="true" /> + <option name="JEKYLL_FRONT_MATTER" value="false" /> + <option name="SIM_TOC_BLANK_LINE_SPACER" value="true" /> + </ParserOptions> + </ParserSettings> + <HtmlSettings headerTopEnabled="false" headerBottomEnabled="false" bodyTopEnabled="false" bodyBottomEnabled="false" embedUrlContent="false" addPageHeader="true" embedImages="false" embedHttpImages="false"> + <GeneratorProvider> + <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.generator" providerName="Default Swing HTML Generator" /> + </GeneratorProvider> + <headerTop /> + <headerBottom /> + <bodyTop /> + <bodyBottom /> + </HtmlSettings> + <CssSettings previewScheme="UI_SCHEME" cssUri="" isCssUriEnabled="false" isCssTextEnabled="false" isDynamicPageWidth="true"> + <StylesheetProvider> + <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.css" providerName="Default Swing Stylesheet" /> + </StylesheetProvider> + <ScriptProviders /> + <cssText /> + </CssSettings> + <HtmlExportSettings updateOnSave="false" parentDir="$ProjectFileDir$" targetDir="$ProjectFileDir$" cssDir="" scriptDir="" plainHtml="false" imageDir="" copyLinkedImages="false" imageUniquifyType="0" targetExt="" useTargetExt="false" noCssNoScripts="false" linkToExportedHtml="true" exportOnSettingsChange="true" regenerateOnProjectOpen="false" linkFormatType="HTTP_ABSOLUTE" /> + <LinkMapSettings> + <textMaps /> + </LinkMapSettings> + </component> +</project> \ No newline at end of file diff --git a/.idea/markdown-navigator/profiles_settings.xml b/.idea/markdown-navigator/profiles_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..57927c5a72b6696671ef9629d3734dda9d5f96b0 --- /dev/null +++ b/.idea/markdown-navigator/profiles_settings.xml @@ -0,0 +1,3 @@ +<component name="MarkdownNavigator.ProfileManager"> + <settings default="" pdf-export="" /> +</component> \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index b8fbae4eb2b90f275ea6675c688829912a6991c5..004377410eb3671ca629438a070e31c4be622361 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,20 +1,29 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="BookmarkManager"> - <bookmark url="file://$PROJECT_DIR$/guru.py" line="134" mnemonic="8" /> - <bookmark url="file://$PROJECT_DIR$/modules/scheduling/scheduler.py" line="241" mnemonic="1" /> + <bookmark url="file://$PROJECT_DIR$/guru.py" line="135" mnemonic="8" /> + <bookmark url="file://$PROJECT_DIR$/modules/scheduling/scheduler.py" line="259" mnemonic="1" /> </component> <component name="ChangeListManager"> <list default="true" id="c58ca86a-4167-4474-accb-41439a535514" name="Default" comment=""> - <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" /> - <change beforePath="$PROJECT_DIR$/aura.py" afterPath="$PROJECT_DIR$/aura.py" /> - <change beforePath="$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py" afterPath="$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py" /> - <change beforePath="$PROJECT_DIR$/modules/communication/liquidsoap/initthread.py" afterPath="$PROJECT_DIR$/modules/communication/liquidsoap/initthread.py" /> - <change beforePath="$PROJECT_DIR$/modules/controller/controller.py" afterPath="$PROJECT_DIR$/modules/controller/controller.py" /> - <change beforePath="$PROJECT_DIR$/modules/liquidsoap/simplestmixer.liq" afterPath="$PROJECT_DIR$/modules/liquidsoap/simplestmixer.liq" /> - <change beforePath="$PROJECT_DIR$/modules/liquidsoap/simplestmixer.log" afterPath="$PROJECT_DIR$/modules/liquidsoap/simplestmixer.log" /> - <change beforePath="$PROJECT_DIR$/modules/scheduling/scheduler.py" afterPath="$PROJECT_DIR$/modules/scheduling/scheduler.py" /> - <change beforePath="$PROJECT_DIR$/modules/tools/padavan.py" afterPath="$PROJECT_DIR$/modules/tools/padavan.py" /> + <change type="DELETED" beforePath="$PROJECT_DIR$/modules/liquidsoap/dynamicsources.log" afterPath="" /> + <change type="DELETED" beforePath="$PROJECT_DIR$/modules/liquidsoap/problem.log" afterPath="" /> + <change type="DELETED" beforePath="$PROJECT_DIR$/modules/liquidsoap/simpleplayer.log" afterPath="" /> + <change type="DELETED" beforePath="$PROJECT_DIR$/modules/liquidsoap/test.log" afterPath="" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/README.md" afterPath="$PROJECT_DIR$/README.md" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/aura.py" afterPath="$PROJECT_DIR$/aura.py" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/guru.py" afterPath="$PROJECT_DIR$/guru.py" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/libraries/base/calendar.py" afterPath="$PROJECT_DIR$/libraries/base/calendar.py" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/libraries/database/broadcasts.py" afterPath="$PROJECT_DIR$/libraries/database/broadcasts.py" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/libraries/enum/redischannels.py" afterPath="$PROJECT_DIR$/libraries/enum/redischannels.py" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/modules/communication/liquidsoap/client.py" afterPath="$PROJECT_DIR$/modules/communication/liquidsoap/client.py" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py" afterPath="$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/modules/communication/redis/adapter.py" afterPath="$PROJECT_DIR$/modules/communication/redis/adapter.py" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/modules/controller/controller.py" afterPath="$PROJECT_DIR$/modules/controller/controller.py" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/modules/liquidsoap/simplestmixer.log" afterPath="$PROJECT_DIR$/modules/liquidsoap/simplestmixer.log" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/modules/scheduling/scheduler.py" afterPath="$PROJECT_DIR$/modules/scheduling/scheduler.py" /> + <change type="MODIFICATION" beforePath="$PROJECT_DIR$/modules/tools/padavan.py" afterPath="$PROJECT_DIR$/modules/tools/padavan.py" /> </list> <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> <option name="TRACKING_ENABLED" value="true" /> @@ -25,112 +34,106 @@ </component> <component name="FileEditorManager"> <leaf SIDE_TABS_SIZE_LIMIT_KEY="300"> - <file leaf-file-name="guru.py" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/guru.py"> + <file leaf-file-name="controller.py" pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/modules/controller/controller.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="1785"> - <caret line="114" column="16" lean-forward="false" selection-start-line="114" selection-start-column="16" selection-end-line="114" selection-end-column="16" /> - <folding /> + <state relative-caret-position="212"> + <caret line="84" column="51" lean-forward="true" selection-start-line="84" selection-start-column="51" selection-end-line="84" selection-end-column="51" /> + <folding> + <element signature="e#43#56#0" expanded="true" /> + </folding> </state> </provider> </entry> </file> - <file leaf-file-name="simplestmixer.liq" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/modules/liquidsoap/simplestmixer.liq"> + <file leaf-file-name="calendar.py" pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/libraries/base/calendar.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="119"> - <caret line="7" column="20" lean-forward="false" selection-start-line="7" selection-start-column="20" selection-end-line="7" selection-end-column="20" /> + <state relative-caret-position="108"> + <caret line="179" column="22" lean-forward="true" selection-start-line="179" selection-start-column="22" selection-end-line="179" selection-end-column="22" /> <folding /> </state> </provider> </entry> </file> - <file leaf-file-name="padavan.py" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/modules/tools/padavan.py"> + <file leaf-file-name="broadcasts.py" pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/libraries/database/broadcasts.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="182"> - <caret line="148" column="53" lean-forward="false" selection-start-line="148" selection-start-column="53" selection-end-line="148" selection-end-column="53" /> + <state relative-caret-position="235"> + <caret line="15" column="9" lean-forward="false" selection-start-line="15" selection-start-column="9" selection-end-line="15" selection-end-column="9" /> <folding> - <element signature="e#0#17#0" expanded="true" /> + <element signature="e#47#79#0" expanded="true" /> </folding> </state> </provider> </entry> </file> - <file leaf-file-name="controller.py" pinned="false" current-in-tab="true"> - <entry file="file://$PROJECT_DIR$/modules/controller/controller.py"> + <file leaf-file-name="communicator.py" pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="261"> - <caret line="102" column="33" lean-forward="false" selection-start-line="102" selection-start-column="33" selection-end-line="102" selection-end-column="33" /> - <folding> - <element signature="e#43#56#0" expanded="true" /> - </folding> + <state relative-caret-position="306"> + <caret line="143" column="28" lean-forward="true" selection-start-line="143" selection-start-column="28" selection-end-line="143" selection-end-column="28" /> + <folding /> </state> </provider> </entry> </file> - <file leaf-file-name="aura.py" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/aura.py"> + <file leaf-file-name="scheduler.py" pinned="false" current-in-tab="true"> + <entry file="file://$PROJECT_DIR$/modules/scheduling/scheduler.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="159"> - <caret line="24" column="34" lean-forward="false" selection-start-line="24" selection-start-column="34" selection-end-line="24" selection-end-column="34" /> - <folding /> + <state relative-caret-position="17"> + <caret line="343" column="32" lean-forward="false" selection-start-line="343" selection-start-column="32" selection-end-line="343" selection-end-column="32" /> + <folding> + <element signature="e#1046#1059#0" expanded="true" /> + </folding> </state> </provider> </entry> </file> - <file leaf-file-name="communicator.py" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py"> + <file leaf-file-name="guru.py" pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/guru.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="387"> - <caret line="1002" column="12" lean-forward="false" selection-start-line="1002" selection-start-column="12" selection-end-line="1002" selection-end-column="12" /> + <state relative-caret-position="144"> + <caret line="54" column="110" lean-forward="false" selection-start-line="54" selection-start-column="89" selection-end-line="54" selection-end-column="110" /> <folding /> </state> </provider> </entry> </file> - <file leaf-file-name="playerclient.py" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/modules/communication/liquidsoap/playerclient.py"> + <file leaf-file-name="padavan.py" pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/modules/tools/padavan.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="343"> - <caret line="294" column="40" lean-forward="false" selection-start-line="294" selection-start-column="40" selection-end-line="294" selection-end-column="40" /> - <folding /> + <state relative-caret-position="482"> + <caret line="138" column="41" lean-forward="false" selection-start-line="138" selection-start-column="41" selection-end-line="138" selection-end-column="41" /> + <folding> + <element signature="e#0#17#0" expanded="true" /> + </folding> </state> </provider> </entry> </file> - <file leaf-file-name="initthread.py" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/modules/communication/liquidsoap/initthread.py"> + <file leaf-file-name="redischannels.py" pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/libraries/enum/redischannels.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="578"> - <caret line="38" column="17" lean-forward="false" selection-start-line="38" selection-start-column="17" selection-end-line="38" selection-end-column="17" /> + <state relative-caret-position="170"> + <caret line="10" column="42" lean-forward="false" selection-start-line="10" selection-start-column="42" selection-end-line="10" selection-end-column="42" /> <folding /> </state> </provider> </entry> </file> - <file leaf-file-name="scheduler.py" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/modules/scheduling/scheduler.py"> + <file leaf-file-name="__init__.py" pinned="false" current-in-tab="false"> + <entry file="file:///usr/local/lib/python3.5/dist-packages/sqlalchemy/__init__.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="343"> - <caret line="241" column="70" lean-forward="false" selection-start-line="241" selection-start-column="70" selection-end-line="241" selection-end-column="70" /> + <state relative-caret-position="-2091"> + <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> <folding> - <element signature="e#1046#1059#0" expanded="true" /> + <element signature="e#244#892#0" expanded="true" /> </folding> </state> </provider> </entry> </file> - <file leaf-file-name="message.py" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/modules/liquidsoap/helpers/message.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="648"> - <caret line="54" column="40" lean-forward="false" selection-start-line="54" selection-start-column="40" selection-end-line="54" selection-end-column="40" /> - <folding /> - </state> - </provider> - </entry> - </file> </leaf> </component> <component name="FileTemplateManagerImpl"> @@ -142,19 +145,6 @@ </component> <component name="FindInProjectRecents"> <findStrings> - <find>time</find> - <find>found entry</find> - <find>print(ty</find> - <find>messageTimer</find> - <find>self.programme</find> - <find>append</find> - <find>fatal</find> - <find>annotate:</find> - <find>messaget</find> - <find>controller</find> - <find>get_active</find> - <find>get_active_source</find> - <find>activate_fs</find> <find>active</find> <find>activate_line</find> <find>is already act</find> @@ -163,7 +153,6 @@ <find>transaction</find> <find>diff/</find> <find>enable</find> - <find>/</find> <find>the cop</find> <find>timeout</find> <find>upcoming s</find> @@ -172,6 +161,20 @@ <find>switch_mixer_number</find> <find>switch_mixer_</find> <find>"select"</find> + <find>pyev</find> + <find>relative</find> + <find>mysql</find> + <find>Config is</find> + <find>/var/audio</find> + <find>/</find> + <find>schedule id</find> + <find>hulla</find> + <find>NoP</find> + <find>work</find> + <find>print</find> + <find>move</find> + <find>move_</find> + <find>run</find> </findStrings> <replaceStrings> <replace>"</replace> @@ -194,7 +197,6 @@ <option value="$PROJECT_DIR$/errormessages/controller_error.js" /> <option value="$PROJECT_DIR$/configuration/scheduler.xml" /> <option value="$PROJECT_DIR$/libraries/exceptions/auraexceptions" /> - <option value="$PROJECT_DIR$/libraries/database/database.py" /> <option value="$PROJECT_DIR$/modules/communication/liquidsoap/InitThread.py" /> <option value="$PROJECT_DIR$/modules/communication/liquidsoap/LiquidSoapPlayerClient.py" /> <option value="$PROJECT_DIR$/modules/liquidsoap/serversettings.liq" /> @@ -204,10 +206,8 @@ <option value="$PROJECT_DIR$/modules/liquidsoap/settings.liq" /> <option value="$PROJECT_DIR$/modules/liquidsoap/serverfunctions.liq" /> <option value="$PROJECT_DIR$/modules/communication/zmq/zmqadapter.py" /> - <option value="$PROJECT_DIR$/libraries/base/calendar.py" /> <option value="$PROJECT_DIR$/modules/liquidsoap/simpleplayer.liq" /> <option value="$PROJECT_DIR$/modules/communication/liquidsoap/LiquidSoapInitThread.py" /> - <option value="$PROJECT_DIR$/libraries/database/broadcasts.py" /> <option value="$PROJECT_DIR$/configuration/aura.ini" /> <option value="$PROJECT_DIR$/libraries/reporting/statestore.py" /> <option value="$PROJECT_DIR$/libraries/exceptions/auraexceptions.py" /> @@ -220,23 +220,26 @@ <option value="$PROJECT_DIR$/modules/communication/redis/redisadapter.py" /> <option value="$PROJECT_DIR$/libraries/client/auraclient.py" /> <option value="$PROJECT_DIR$/modules/liquidsoap/problem.liq" /> - <option value="$PROJECT_DIR$/README.md" /> - <option value="$PROJECT_DIR$/modules/communication/liquidsoap/client.py" /> <option value="$PROJECT_DIR$/libraries/enum/consolecolor.py" /> <option value="$PROJECT_DIR$/modules/communication/redis/messenger.py" /> <option value="$PROJECT_DIR$/libraries/database/combadb.py" /> - <option value="$PROJECT_DIR$/libraries/enum/redischannels.py" /> <option value="$PROJECT_DIR$/libraries/database/statestore.py" /> - <option value="$PROJECT_DIR$/modules/communication/redis/adapter.py" /> <option value="$PROJECT_DIR$/modules/liquidsoap/fallback.liq" /> - <option value="$PROJECT_DIR$/guru.py" /> - <option value="$PROJECT_DIR$/aura.py" /> <option value="$PROJECT_DIR$/modules/liquidsoap/simplestmixer.liq" /> - <option value="$PROJECT_DIR$/modules/scheduling/scheduler.py" /> <option value="$PROJECT_DIR$/modules/communication/liquidsoap/initthread.py" /> - <option value="$PROJECT_DIR$/modules/tools/padavan.py" /> - <option value="$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py" /> + <option value="$PROJECT_DIR$/aura.py" /> <option value="$PROJECT_DIR$/modules/controller/controller.py" /> + <option value="$PROJECT_DIR$/libraries/database/database.py" /> + <option value="$PROJECT_DIR$/libraries/base/calendar.py" /> + <option value="$PROJECT_DIR$/README.md" /> + <option value="$PROJECT_DIR$/modules/communication/liquidsoap/client.py" /> + <option value="$PROJECT_DIR$/libraries/enum/redischannels.py" /> + <option value="$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py" /> + <option value="$PROJECT_DIR$/guru.py" /> + <option value="$PROJECT_DIR$/modules/communication/redis/adapter.py" /> + <option value="$PROJECT_DIR$/modules/tools/padavan.py" /> + <option value="$PROJECT_DIR$/libraries/database/broadcasts.py" /> + <option value="$PROJECT_DIR$/modules/scheduling/scheduler.py" /> </list> </option> </component> @@ -277,108 +280,66 @@ <foldersAlwaysOnTop value="true" /> </navigator> <panes> - <pane id="Scope" /> <pane id="Scratches" /> <pane id="ProjectPane"> <subPane> <expand> <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> - </path> - <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> - <item name="configuration" type="462c0819:PsiDirectoryNode" /> - </path> - <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> - <item name="libraries" type="462c0819:PsiDirectoryNode" /> + <item name="engine" type="b2602c69:ProjectViewProjectNode" /> + <item name="engine" type="462c0819:PsiDirectoryNode" /> </path> <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> + <item name="engine" type="b2602c69:ProjectViewProjectNode" /> + <item name="engine" type="462c0819:PsiDirectoryNode" /> <item name="libraries" type="462c0819:PsiDirectoryNode" /> - <item name="base" type="462c0819:PsiDirectoryNode" /> </path> <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> + <item name="engine" type="b2602c69:ProjectViewProjectNode" /> + <item name="engine" type="462c0819:PsiDirectoryNode" /> <item name="libraries" type="462c0819:PsiDirectoryNode" /> <item name="database" type="462c0819:PsiDirectoryNode" /> </path> <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> - <item name="libraries" type="462c0819:PsiDirectoryNode" /> - <item name="enum" type="462c0819:PsiDirectoryNode" /> - </path> - <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> - <item name="libraries" type="462c0819:PsiDirectoryNode" /> - <item name="exceptions" type="462c0819:PsiDirectoryNode" /> - </path> - <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> - <item name="libraries" type="462c0819:PsiDirectoryNode" /> - <item name="reporting" type="462c0819:PsiDirectoryNode" /> - </path> - <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> - <item name="libraries" type="462c0819:PsiDirectoryNode" /> - <item name="security" type="462c0819:PsiDirectoryNode" /> - </path> - <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> - <item name="modules" type="462c0819:PsiDirectoryNode" /> - </path> - <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> + <item name="engine" type="b2602c69:ProjectViewProjectNode" /> + <item name="engine" type="462c0819:PsiDirectoryNode" /> <item name="modules" type="462c0819:PsiDirectoryNode" /> - <item name="communication" type="462c0819:PsiDirectoryNode" /> </path> <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> + <item name="engine" type="b2602c69:ProjectViewProjectNode" /> + <item name="engine" type="462c0819:PsiDirectoryNode" /> <item name="modules" type="462c0819:PsiDirectoryNode" /> <item name="communication" type="462c0819:PsiDirectoryNode" /> - <item name="liquidsoap" type="462c0819:PsiDirectoryNode" /> </path> <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> + <item name="engine" type="b2602c69:ProjectViewProjectNode" /> + <item name="engine" type="462c0819:PsiDirectoryNode" /> <item name="modules" type="462c0819:PsiDirectoryNode" /> <item name="communication" type="462c0819:PsiDirectoryNode" /> <item name="redis" type="462c0819:PsiDirectoryNode" /> </path> <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> + <item name="engine" type="b2602c69:ProjectViewProjectNode" /> + <item name="engine" type="462c0819:PsiDirectoryNode" /> <item name="modules" type="462c0819:PsiDirectoryNode" /> <item name="controller" type="462c0819:PsiDirectoryNode" /> </path> <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> + <item name="engine" type="b2602c69:ProjectViewProjectNode" /> + <item name="engine" type="462c0819:PsiDirectoryNode" /> <item name="modules" type="462c0819:PsiDirectoryNode" /> - <item name="scheduling" type="462c0819:PsiDirectoryNode" /> + <item name="liquidsoap" type="462c0819:PsiDirectoryNode" /> </path> <path> - <item name="aura" type="b2602c69:ProjectViewProjectNode" /> - <item name="aura" type="462c0819:PsiDirectoryNode" /> + <item name="engine" type="b2602c69:ProjectViewProjectNode" /> + <item name="engine" type="462c0819:PsiDirectoryNode" /> <item name="modules" type="462c0819:PsiDirectoryNode" /> - <item name="tools" type="462c0819:PsiDirectoryNode" /> + <item name="scheduling" type="462c0819:PsiDirectoryNode" /> </path> </expand> <select /> </subPane> </pane> + <pane id="Scope" /> </panes> </component> <component name="PropertiesComponent"> @@ -431,7 +392,6 @@ <option name="PARAMETERS" value="" /> <option name="SHOW_COMMAND_LINE" value="false" /> <option name="EMULATE_TERMINAL" value="false" /> - <option name="MODULE_MODE" value="false" /> </configuration> <configuration name="aura" type="PythonConfigurationType" factoryName="Python" temporary="true"> <option name="INTERPRETER_OPTIONS" value="" /> @@ -449,7 +409,6 @@ <option name="PARAMETERS" value="" /> <option name="SHOW_COMMAND_LINE" value="false" /> <option name="EMULATE_TERMINAL" value="false" /> - <option name="MODULE_MODE" value="false" /> </configuration> <configuration name="guru" type="PythonConfigurationType" factoryName="Python" temporary="true"> <option name="INTERPRETER_OPTIONS" value="" /> @@ -467,7 +426,6 @@ <option name="PARAMETERS" value="-pap" /> <option name="SHOW_COMMAND_LINE" value="false" /> <option name="EMULATE_TERMINAL" value="false" /> - <option name="MODULE_MODE" value="false" /> </configuration> <list size="2"> <item index="0" class="java.lang.String" itemvalue="Python.guru" /> @@ -512,19 +470,20 @@ <servers /> </component> <component name="ToolWindowManager"> - <frame x="645" y="31" width="1926" height="1052" extended-state="6" /> + <frame x="645" y="31" width="1926" height="1083" extended-state="6" /> <layout> - <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.16692996" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" /> + <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.16666667" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" /> <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" /> <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.46312365" sideWeight="0.5018431" order="13" side_tool="true" content_ui="tabs" /> <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.43275487" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> - <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.42299348" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> + <window_info id="Run" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.37807378" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32936078" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="Python Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" /> <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="11" side_tool="false" content_ui="tabs" /> <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.46312365" sideWeight="0.49815693" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" /> + <window_info id="Data View" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> <window_info id="Debug Logs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" /> @@ -533,7 +492,6 @@ <window_info id="Execute Anonymous" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="10" side_tool="false" content_ui="tabs" /> <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" /> <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> - <window_info id="Data View" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Salesforce" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="12" side_tool="false" content_ui="tabs" /> </layout> <layout-to-restore> @@ -585,56 +543,12 @@ <watches-manager /> </component> <component name="editorHistoryManager"> - <entry file="file:///usr/local/lib/python3.5/dist-packages/simplejson/decoder.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="167"> - <caret line="362" column="8" lean-forward="false" selection-start-line="362" selection-start-column="8" selection-end-line="362" selection-end-column="8" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/errormessages/controller_error.js"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="397"> - <caret line="209" column="0" lean-forward="true" selection-start-line="209" selection-start-column="0" selection-end-line="209" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/configuration/scheduler.xml"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="323"> - <caret line="19" column="24" lean-forward="false" selection-start-line="19" selection-start-column="24" selection-end-line="19" selection-end-column="24" /> - <folding /> - </state> - </provider> - </entry> - <entry file="file:///usr/lib/python3/dist-packages/MySQLdb/connections.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="324"> - <caret line="279" column="0" lean-forward="false" selection-start-line="279" selection-start-column="0" selection-end-line="279" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file:///usr/lib/python3/dist-packages/MySQLdb/cursors.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="163"> - <caret line="216" column="0" lean-forward="false" selection-start-line="216" selection-start-column="0" selection-end-line="216" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file:///usr/local/lib/python3.5/dist-packages/sqlalchemy/engine/default.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="171"> - <caret line="469" column="0" lean-forward="false" selection-start-line="469" selection-start-column="0" selection-end-line="469" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file:///usr/local/lib/python3.5/dist-packages/sqlalchemy/engine/base.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="885"> - <caret line="989" column="0" lean-forward="true" selection-start-line="989" selection-start-column="0" selection-end-line="989" selection-end-column="0" /> - </state> - </provider> - </entry> + <entry file="file://$PROJECT_DIR$/errormessages/controller_error.js" /> + <entry file="file://$PROJECT_DIR$/configuration/scheduler.xml" /> + <entry file="file:///usr/lib/python3/dist-packages/MySQLdb/connections.py" /> + <entry file="file:///usr/lib/python3/dist-packages/MySQLdb/cursors.py" /> + <entry file="file:///usr/local/lib/python3.5/dist-packages/sqlalchemy/engine/default.py" /> + <entry file="file:///usr/local/lib/python3.5/dist-packages/sqlalchemy/engine/base.py" /> <entry file="file://$PROJECT_DIR$/modules/liquidsoap/helpers/D" /> <entry file="file://$PROJECT_DIR$/modules/liquidsoap/__init__.py"> <provider selected="true" editor-type-id="text-editor"> @@ -650,13 +564,6 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/modules/scheduling/models.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="85"> - <caret line="5" column="53" lean-forward="true" selection-start-line="5" selection-start-column="53" selection-end-line="5" selection-end-column="53" /> - </state> - </provider> - </entry> <entry file="file://$PROJECT_DIR$/modules/liquidsoap/helpers/nextfromfallback.py" /> <entry file="file://$PROJECT_DIR$/modules/liquidsoap/readini.liq"> <provider selected="true" editor-type-id="text-editor"> @@ -707,29 +614,10 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/configuration/aura.ini"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="1751"> - <caret line="103" column="9" lean-forward="false" selection-start-line="103" selection-start-column="9" selection-end-line="103" selection-end-column="9" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/libraries/exceptions/auraexceptions.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="374"> - <caret line="22" column="0" lean-forward="false" selection-start-line="22" selection-start-column="0" selection-end-line="22" selection-end-column="0" /> - </state> - </provider> - </entry> + <entry file="file://$PROJECT_DIR$/configuration/aura.ini" /> + <entry file="file://$PROJECT_DIR$/libraries/exceptions/auraexceptions.py" /> <entry file="file://$PROJECT_DIR$/libraries/color/terminal.py" /> - <entry file="file://$PROJECT_DIR$/libraries/base/config.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="238"> - <caret line="81" column="25" lean-forward="false" selection-start-line="81" selection-start-column="25" selection-end-line="81" selection-end-column="25" /> - <folding /> - </state> - </provider> - </entry> + <entry file="file://$PROJECT_DIR$/libraries/base/config.py" /> <entry file="file://$PROJECT_DIR$/libraries/client/auraclient.py" /> <entry file="file://$PROJECT_DIR$/modules/liquidsoap/test.liq"> <provider selected="true" editor-type-id="text-editor"> @@ -745,211 +633,207 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/README.md"> - <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]"> - <state split_layout="SPLIT"> - <first_editor relative-caret-position="935"> - <caret line="55" column="4" lean-forward="false" selection-start-line="55" selection-start-column="4" selection-end-line="55" selection-end-column="4" /> - <folding /> - </first_editor> - <second_editor /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/libraries/enum/consolecolor.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="289"> - <caret line="17" column="20" lean-forward="false" selection-start-line="17" selection-start-column="20" selection-end-line="17" selection-end-column="20" /> - </state> - </provider> - </entry> + <entry file="file://$PROJECT_DIR$/libraries/enum/consolecolor.py" /> <entry file="file://$PROJECT_DIR$/modules/communication/redis/messenger.py"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="170"> <caret line="31" column="13" lean-forward="false" selection-start-line="31" selection-start-column="13" selection-end-line="31" selection-end-column="13" /> - <folding> - <element signature="e#24#35#0" expanded="false" /> - </folding> </state> </provider> </entry> - <entry file="file:///usr/local/lib/python3.5/dist-packages/redis/client.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="220"> - <caret line="2214" column="8" lean-forward="false" selection-start-line="2214" selection-start-column="8" selection-end-line="2214" selection-end-column="8" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/modules/communication/liquidsoap/client.py"> + <entry file="file:///usr/local/lib/python3.5/dist-packages/redis/client.py" /> + <entry file="file://$USER_HOME$/.PyCharmCE2017.3/system/python_stubs/-1247971764/sys.py" /> + <entry file="file:///usr/lib/python3.5/threading.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="448"> - <caret line="169" column="0" lean-forward="false" selection-start-line="169" selection-start-column="0" selection-end-line="169" selection-end-column="0" /> + <state relative-caret-position="185"> + <caret line="1164" column="8" lean-forward="false" selection-start-line="1164" selection-start-column="8" selection-end-line="1164" selection-end-column="8" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/libraries/database/combadb.py"> + <entry file="file://$PROJECT_DIR$/libraries/database/statestore.py" /> + <entry file="file://$PROJECT_DIR$/modules/liquidsoap/fallback.liq"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="-884"> - <caret line="32" column="7" lean-forward="false" selection-start-line="32" selection-start-column="7" selection-end-line="32" selection-end-column="7" /> - <folding /> + <state relative-caret-position="2040"> + <caret line="120" column="119" lean-forward="false" selection-start-line="120" selection-start-column="119" selection-end-line="120" selection-end-column="119" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/libraries/database/database.py"> + <entry file="file://$PROJECT_DIR$/modules/liquidsoap/helpers/message.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="340"> - <caret line="25" column="1" lean-forward="false" selection-start-line="25" selection-start-column="1" selection-end-line="25" selection-end-column="1" /> - <folding /> + <state relative-caret-position="884"> + <caret line="54" column="40" lean-forward="false" selection-start-line="54" selection-start-column="40" selection-end-line="54" selection-end-column="40" /> </state> </provider> </entry> - <entry file="file://$USER_HOME$/.PyCharmCE2017.3/system/python_stubs/-1247971764/sys.py"> + <entry file="file://$PROJECT_DIR$/modules/liquidsoap/simplestmixer.liq"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="193"> - <caret line="404" column="4" lean-forward="false" selection-start-line="404" selection-start-column="4" selection-end-line="404" selection-end-column="4" /> + <state relative-caret-position="119"> + <caret line="7" column="20" lean-forward="false" selection-start-line="7" selection-start-column="20" selection-end-line="7" selection-end-column="20" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/libraries/enum/redischannels.py"> + <entry file="file://$PROJECT_DIR$/modules/communication/liquidsoap/playerclient.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="153"> - <caret line="9" column="42" lean-forward="false" selection-start-line="9" selection-start-column="42" selection-end-line="9" selection-end-column="42" /> + <state relative-caret-position="4998"> + <caret line="294" column="40" lean-forward="false" selection-start-line="294" selection-start-column="40" selection-end-line="294" selection-end-column="40" /> </state> </provider> </entry> - <entry file="file:///usr/lib/python3.5/threading.py"> + <entry file="file://$PROJECT_DIR$/aura.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="185"> - <caret line="1164" column="8" lean-forward="false" selection-start-line="1164" selection-start-column="8" selection-end-line="1164" selection-end-column="8" /> + <state relative-caret-position="272"> + <caret line="24" column="32" lean-forward="false" selection-start-line="24" selection-start-column="32" selection-end-line="24" selection-end-column="32" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/libraries/base/calendar.py"> + <entry file="file://$PROJECT_DIR$/libraries/database/combadb.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="-130"> - <caret line="120" column="38" lean-forward="false" selection-start-line="120" selection-start-column="38" selection-end-line="120" selection-end-column="38" /> - <folding /> + <state relative-caret-position="-765"> + <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/libraries/database/statestore.py"> + <entry file="file://$PROJECT_DIR$/modules/scheduling/models.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="372"> - <caret line="304" column="69" lean-forward="false" selection-start-line="304" selection-start-column="69" selection-end-line="304" selection-end-column="69" /> + <state relative-caret-position="51"> + <caret line="5" column="53" lean-forward="false" selection-start-line="5" selection-start-column="53" selection-end-line="5" selection-end-column="53" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/modules/communication/redis/adapter.py"> + <entry file="file://$PROJECT_DIR$/libraries/database/database.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="2210"> - <caret line="145" column="96" lean-forward="false" selection-start-line="145" selection-start-column="96" selection-end-line="145" selection-end-column="96" /> + <state relative-caret-position="357"> + <caret line="26" column="0" lean-forward="false" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" /> <folding> - <element signature="e#0#16#0" expanded="false" /> + <element signature="e#0#55#0" expanded="true" /> </folding> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/libraries/database/broadcasts.py"> + <entry file="file://$PROJECT_DIR$/modules/communication/liquidsoap/initthread.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="2040"> - <caret line="125" column="88" lean-forward="false" selection-start-line="125" selection-start-column="88" selection-end-line="125" selection-end-column="88" /> + <state relative-caret-position="510"> + <caret line="34" column="33" lean-forward="false" selection-start-line="34" selection-start-column="33" selection-end-line="34" selection-end-column="33" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/modules/liquidsoap/fallback.liq"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="2040"> - <caret line="120" column="119" lean-forward="false" selection-start-line="120" selection-start-column="119" selection-end-line="120" selection-end-column="119" /> + <entry file="file://$PROJECT_DIR$/README.md"> + <provider editor-type-id="text-editor"> + <state relative-caret-position="0"> + <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> <folding /> </state> </provider> + <provider selected="true" editor-type-id="split-provider[text-editor;MarkdownPreviewEditor]"> + <state split_layout="SPLIT"> + <first_editor relative-caret-position="697"> + <caret line="41" column="17" lean-forward="true" selection-start-line="41" selection-start-column="17" selection-end-line="41" selection-end-column="17" /> + <folding /> + </first_editor> + <second_editor> + <js_state /> + </second_editor> + </state> + </provider> </entry> - <entry file="file://$PROJECT_DIR$/guru.py"> + <entry file="file:///usr/local/lib/python3.5/dist-packages/sqlalchemy/__init__.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="1785"> - <caret line="114" column="16" lean-forward="false" selection-start-line="114" selection-start-column="16" selection-end-line="114" selection-end-column="16" /> - <folding /> + <state relative-caret-position="-2091"> + <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> + <folding> + <element signature="e#244#892#0" expanded="true" /> + </folding> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/modules/liquidsoap/helpers/message.py"> + <entry file="file://$PROJECT_DIR$/modules/communication/liquidsoap/client.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="648"> - <caret line="54" column="40" lean-forward="false" selection-start-line="54" selection-start-column="40" selection-end-line="54" selection-end-column="40" /> + <state relative-caret-position="178"> + <caret line="57" column="34" lean-forward="false" selection-start-line="57" selection-start-column="34" selection-end-line="57" selection-end-column="34" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/modules/liquidsoap/simplestmixer.liq"> + <entry file="file://$PROJECT_DIR$/modules/controller/controller.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="119"> - <caret line="7" column="20" lean-forward="false" selection-start-line="7" selection-start-column="20" selection-end-line="7" selection-end-column="20" /> - <folding /> + <state relative-caret-position="212"> + <caret line="84" column="51" lean-forward="true" selection-start-line="84" selection-start-column="51" selection-end-line="84" selection-end-column="51" /> + <folding> + <element signature="e#43#56#0" expanded="true" /> + </folding> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/modules/communication/liquidsoap/playerclient.py"> + <entry file="file://$PROJECT_DIR$/modules/communication/redis/adapter.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="343"> - <caret line="294" column="40" lean-forward="false" selection-start-line="294" selection-start-column="40" selection-end-line="294" selection-end-column="40" /> + <state relative-caret-position="142"> + <caret line="158" column="122" lean-forward="true" selection-start-line="158" selection-start-column="122" selection-end-line="158" selection-end-column="122" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/modules/scheduling/scheduler.py"> + <entry file="file://$PROJECT_DIR$/modules/tools/padavan.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="343"> - <caret line="241" column="70" lean-forward="false" selection-start-line="241" selection-start-column="70" selection-end-line="241" selection-end-column="70" /> + <state relative-caret-position="482"> + <caret line="138" column="41" lean-forward="false" selection-start-line="138" selection-start-column="41" selection-end-line="138" selection-end-column="41" /> <folding> - <element signature="e#1046#1059#0" expanded="true" /> + <element signature="e#0#17#0" expanded="true" /> </folding> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/aura.py"> + <entry file="file://$PROJECT_DIR$/libraries/enum/redischannels.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="159"> - <caret line="24" column="34" lean-forward="false" selection-start-line="24" selection-start-column="34" selection-end-line="24" selection-end-column="34" /> + <state relative-caret-position="170"> + <caret line="10" column="42" lean-forward="false" selection-start-line="10" selection-start-column="42" selection-end-line="10" selection-end-column="42" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/modules/communication/liquidsoap/initthread.py"> + <entry file="file://$PROJECT_DIR$/guru.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="578"> - <caret line="38" column="17" lean-forward="false" selection-start-line="38" selection-start-column="17" selection-end-line="38" selection-end-column="17" /> + <state relative-caret-position="144"> + <caret line="54" column="110" lean-forward="false" selection-start-line="54" selection-start-column="89" selection-end-line="54" selection-end-column="110" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/modules/tools/padavan.py"> + <entry file="file://$PROJECT_DIR$/libraries/base/calendar.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="182"> - <caret line="148" column="53" lean-forward="false" selection-start-line="148" selection-start-column="53" selection-end-line="148" selection-end-column="53" /> + <state relative-caret-position="108"> + <caret line="179" column="22" lean-forward="true" selection-start-line="179" selection-start-column="22" selection-end-line="179" selection-end-column="22" /> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/libraries/database/broadcasts.py"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="235"> + <caret line="15" column="9" lean-forward="false" selection-start-line="15" selection-start-column="9" selection-end-line="15" selection-end-column="9" /> <folding> - <element signature="e#0#17#0" expanded="true" /> + <element signature="e#47#79#0" expanded="true" /> </folding> </state> </provider> </entry> <entry file="file://$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="387"> - <caret line="1002" column="12" lean-forward="false" selection-start-line="1002" selection-start-column="12" selection-end-line="1002" selection-end-column="12" /> + <state relative-caret-position="306"> + <caret line="143" column="28" lean-forward="true" selection-start-line="143" selection-start-column="28" selection-end-line="143" selection-end-column="28" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/modules/controller/controller.py"> + <entry file="file://$PROJECT_DIR$/modules/scheduling/scheduler.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="261"> - <caret line="102" column="33" lean-forward="false" selection-start-line="102" selection-start-column="33" selection-end-line="102" selection-end-column="33" /> + <state relative-caret-position="17"> + <caret line="343" column="32" lean-forward="false" selection-start-line="343" selection-start-column="32" selection-end-line="343" selection-end-column="32" /> <folding> - <element signature="e#43#56#0" expanded="true" /> + <element signature="e#1046#1059#0" expanded="true" /> </folding> </state> </provider> diff --git a/README.md b/README.md index e5c5231d3d4aaca0ea64924f779f08d15ccb2365..6555429eff5124afb87f45a4eb7b2eb4719430d6 100644 --- a/README.md +++ b/README.md @@ -20,23 +20,46 @@ Any sound supporting linux system should work. It is tested and coded on a **deb On a debian machine: ```bash -sudo apt install git \ - python3 python3-pip \ - liquidsoap liquidsoap-plugin-alsa liquidsoap-plugin-ao liquidsoap-plugin-faad \ - liquidsoap-plugin-flac liquidsoap-plugin-icecast liquidsoap-plugin-lame \ - liquidsoap-plugin-mad liquidsoap-plugin-ogg liquidsoap-plugin-pulseaudio \ - liquidsoap-plugin-samplerate liquidsoap-plugin-taglib liquidsoap-plugin-voaacenc \ - liquidsoap-plugin-vorbis +sudo apt install \ + git \ + python3 python3-pip \ + redis-server redis-tools \ + liquidsoap liquidsoap-plugin-alsa liquidsoap-plugin-flac liquidsoap-plugin-icecast liquidsoap-plugin-pulseaudio \ + libev4 libev-dev \ + mariadb-server libmariadbclient-dev ``` + #### Python Packages ``` -sudo pip3 install Flask Flask-Babel flask-babel-utclocal-utils \ - flask-mongoengine Flask-RESTful Flask-SQLAlchemy Flask-WTF \ +sudo pip3 install \ + Flask Flask-Babel Flask-SQLAlchemy Flask-WTF \ mysqlclient redis simplejson + pyev python-dateutil ``` +#### get the code + +git clone https://gitlab.servus.at/autoradio/engine + +#### Set Up a database + +mysql -u root -p + +CREATE DATABASE aura_engine CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +CREATE USER 'aura'@'localhost' IDENTIFIED BY 'secure-password'; +GRANT ALL PRIVILEGES ON aura_engine.* TO 'aura'@'localhost'; + +#### Files + +Create the audio folder defined in your aura.ini +mkdir /var/audio +mkdir /etc/aura +cp {where you cloned the repo}/configuration/aura.ini /etc/aura/aura.ini + +edit installation dir and database settings in aura.ini + #### aura.py It is the server which is connected to the external programme source, to liquidsoap and is listening for redis pubsub messages. diff --git a/aura.py b/aura.py index 5aa3f4ba6638af1cca010292c7e364283c4678fe..cf5c1d9134848e0b8765c9bc7a6660f1f33d4310 100755 --- a/aura.py +++ b/aura.py @@ -38,16 +38,17 @@ class Aura(): # start listener thread self.messenger.start() + # # ## ## ## ## ## # # # # ENTRY FUNCTION # # # # ## ## ## ## ## # # def main(): aura = Aura() aura.join_comm() - # # ## ## ## ## ## ## # # # # End ENTRY FUNCTION # # # # ## ## ## ## ## ## # # + if __name__ == "__main__": main() \ No newline at end of file diff --git a/guru.py b/guru.py index ee55110b4fe16522d44ba9da769a92bb4e9523b2..e3073356275b67e9d16617146581302b4427ca66 100755 --- a/guru.py +++ b/guru.py @@ -52,9 +52,9 @@ class Guru: # help="Add new source to LiquidSoap mixer [Experimental]") # playlist manipulation - parser.add_argument("-mpe", "--move-playlist-entry", action="store", dest="move_playlist_entry", default=0, metavar=("FROM", "TO"), nargs=2, - help="Move Playlistentry FROM index TO another index") - parser.add_argument("-dpe", "--delete-playlist-entry", action="store", dest="delete_playlist_entry", default=0, metavar=("INDEX"), + parser.add_argument("-mpe", "--swap-playlist-entries", action="store", dest="swap_playlist_entries", default=0, metavar=("FROM", "TO"), nargs=2, + help="Swaps two Playlistentries") + parser.add_argument("-dpe", "--delete-playlist-entry", action="store", dest="delete_playlist_entry", default=0, metavar="INDEX", help="Delete Playlistentry at INDEX") parser.add_argument("-ape", "--add-playlist-entry", action="store", dest="add_playlist_entry", default=0, metavar=("INDEX", "FROMTIME", "SOURCE"), nargs=3, help="Add a new Playlistentry at a given index", type=valid_playlist_entry) @@ -94,6 +94,7 @@ class Guru: if not args.quiet: print("Guru thinking...") + try: p = Padavan(args, self.config) p.meditate() diff --git a/libraries/base/calendar.py b/libraries/base/calendar.py index f9499d5337bea68b0e5e1fa5b93352006981dc38..8a4a9943c0024e9ad665be21a8f6141a1f1d721a 100644 --- a/libraries/base/calendar.py +++ b/libraries/base/calendar.py @@ -207,6 +207,8 @@ class AuraCalendarService(threading.Thread): schedule_entry.tracknum = entry["tracknum"] schedule_entry.cdnum = entry["cdnum"] schedule_entry.year = entry["year"] + if schedule_entry.year == '': + schedule_entry.year = 0 if self.debug: print("Storing entries... playlist_id: " + str(schedule["playlist_id"]) + " schedule_id: " + str( diff --git a/libraries/database/broadcasts.py b/libraries/database/broadcasts.py index a0820766c22d191b0a6db03877ff62e311750ed6..e0204bf457309f283179b26ab1f45c2130ef20f3 100644 --- a/libraries/database/broadcasts.py +++ b/libraries/database/broadcasts.py @@ -11,29 +11,30 @@ from libraries.database.database import db class Model: def store(self, commit=False): - db.session.add(self) + curr_db_sessions = db.session.object_session(self) + curr_db_sessions.add(self) + #db.session.add(self) if commit: self.commit() - def commit(self): + @staticmethod + def commit(): db.session.commit() -# def dump_datetime(self, value): -# """Deserialize datetime object into string form for JSON processing.""" -# if value is None: -# return None -# return [value.strftime("%Y-%m-%d"), value.strftime("%H:%M:%S")] - -# def alchemy_encoder(obj): -# """JSON encoder function for SQLAlchemy special classes.""" -# if isinstance(obj, datetime.date): -# return obj.isoformat() -# elif isinstance(obj, decimal.Decimal): -# return float(obj) - def _asdict(self): return self.__dict__ + @staticmethod + def recreate_db(): + print("Recreating Database...") + db.drop_all() + print("all dropped. creating...") + db.create_all() + print("all created. commiting...") + db.session.commit() + print("Database recreated!") + # sys.exit(0) + # ------------------------------------------------------------------------------------------ # class ScheduleModel(Model): @@ -57,9 +58,12 @@ class ScheduleEntryModel(Model): def select_all(): all_entries = ScheduleEntry.query.filter().all() + cnt = 0 for entry in all_entries: + entry.programme_index = cnt entry.entry_start_unix = time.mktime(entry.entry_start.timetuple()) entry.entry_end_unix = time.mktime(entry.entry_end.timetuple()) + cnt = cnt + 1 return all_entries @@ -139,6 +143,7 @@ class ScheduleEntry(db.Model, ScheduleEntryModel): volume = Column(Integer, default=100) entry_start_unix = 0 entry_end_unix = 0 + programme_index = -1 # def __init__(self, playlist_id, entry_num, schedule_id, entry_start, entry_end, source, artist, track, albumname, genre, tracknum, cdnum, year): @@ -172,6 +177,7 @@ class ScheduleEntry(db.Model, ScheduleEntryModel): e.tracknum = tracknum e.cdnum = cdnum e.year = year + return e # @property # def serialize(self): @@ -192,14 +198,5 @@ class ScheduleEntry(db.Model, ScheduleEntryModel): # show_id = Column(Integer, ForeignKey("timeslot.id")) -def recreateDB(): - print("Recreating Database...") - db.drop_all() - print("all dropped. creating...") - db.create_all() - print("all created. commiting...") - db.session.commit() - print("Database recreated!") - sys.exit(0) -#recreateDB() +#Model.recreate_db() diff --git a/libraries/enum/redischannels.py b/libraries/enum/redischannels.py index cfc76fe4aebd129070481847e8a5011a6d878458..4c92cb86203e73cc675b1b606e650b4903f4f93e 100644 --- a/libraries/enum/redischannels.py +++ b/libraries/enum/redischannels.py @@ -8,3 +8,4 @@ class Channels(Enum): GAP_REPLY = "get_act_programme_reply" IP_REPLY = "init_player_reply" PMQ_REPLY = "print_message_queue_reply" + MPE_REPLY = "move_playlist_entry_reply" diff --git a/modules/communication/liquidsoap/client.py b/modules/communication/liquidsoap/client.py index 89406dc908ba685b761ce288891e4ef86a94efcf..387629163ed7d40fd955e1a3061c1244191a36db 100644 --- a/modules/communication/liquidsoap/client.py +++ b/modules/communication/liquidsoap/client.py @@ -55,6 +55,7 @@ class LiquidSoapClient: self.client.connect(self.socket_path) except socket.error as e: self.connected = False + print(self.socket_path) raise LQConnectionError(e, self.socket_path) return False else: diff --git a/modules/communication/liquidsoap/communicator.py b/modules/communication/liquidsoap/communicator.py index 2001bf9be638f768e6673147cff4191d52729c0e..5f87a43a522223c8a329e32479b4ad254c3a95e3 100644 --- a/modules/communication/liquidsoap/communicator.py +++ b/modules/communication/liquidsoap/communicator.py @@ -134,7 +134,7 @@ class LiquidSoapCommunicator: # ------------------------------------------------------------------------------------------ # def get_all_channels(self): - if self.channels is None: + if self.channels is None or self.channels == ['']: self.channels = self.__send_lqc_command__(self.lqc, "mixer", "inputs") return self.channels diff --git a/modules/communication/redis/adapter.py b/modules/communication/redis/adapter.py index ed08df92203a7ad84dae262241eff49c1cfbb109..fc3394c79b8b57dd79549723d2262f5bb022da98 100644 --- a/modules/communication/redis/adapter.py +++ b/modules/communication/redis/adapter.py @@ -68,12 +68,8 @@ class ServerRedisAdapter(threading.Thread, RedisMessenger): print(TerminalColors.OK_ORANGE.value + "received REDIS message: " + TerminalColors.ENDC.value + str(item) ) - item["channel"] = item["channel"].decode("utf-8") - if isinstance(item["data"], bytes): - item["data"] = item["data"].decode("utf-8") - - if item['data'] == "KILL": - break + item["channel"] = self.decode_if_needed(item["channel"]) + item["data"] = self.decode_if_needed(item["data"]) try: self.work(item) @@ -86,6 +82,12 @@ class ServerRedisAdapter(threading.Thread, RedisMessenger): self.pubsub.unsubscribe() print(self, "unsubscribed from " + self.channel + " and finished") + # ------------------------------------------------------------------------------------------ # + def decode_if_needed(self, val): + if isinstance(val, bytes): + return val.decode("utf-8") + return val + # ------------------------------------------------------------------------------------------ # def listen_for_one_message(self, channel, socket_timeout=2): self.redisdb = redis.Redis(socket_timeout=socket_timeout) @@ -122,23 +124,31 @@ class ServerRedisAdapter(threading.Thread, RedisMessenger): # ------------------------------------------------------------------------------------------ # def work(self, item): if item["data"] == "fetch_new_programme": - self.execute(self.auracontroller.fetch_new_programme, Channels.FNP_REPLY.value) + self.execute(Channels.FNP_REPLY.value, self.auracontroller.fetch_new_programme, ) elif item["data"] == "init_player": - self.execute(self.auracontroller.init_player, Channels.IP_REPLY.value) + self.execute(Channels.IP_REPLY.value, self.auracontroller.init_player, ) elif item["data"] == "get_act_programme": - self.execute(self.auracontroller.get_act_programme, Channels.GAP_REPLY.value) + self.execute(Channels.GAP_REPLY.value, self.auracontroller.get_act_programme, ) elif item["data"] == "print_message_queue": - self.execute(self.scheduler.print_message_queue, Channels.PMQ_REPLY.value) + self.execute(Channels.PMQ_REPLY.value, self.scheduler.print_message_queue, ) + + elif item["data"].find("swap_playlist_entries") >= 0: + extracted = item["data"].split()[1:3] + param = {"from_index": extracted[0], "to_index": extracted[1]} + self.execute(Channels.MPE_REPLY.value, self.scheduler.swap_playlist_entries, param) else: raise RedisConnectionException("ServerRedisAdapter Cannot understand command: " + item["data"]) # ------------------------------------------------------------------------------------------ # - def execute(self, f, channel): - reply = f() + def execute(self, channel, f, param=None): + if param: + reply = f(param) + else: + reply = f() if reply is None: reply = "" @@ -146,6 +156,8 @@ class ServerRedisAdapter(threading.Thread, RedisMessenger): # sometimes the sender is faster than the receiver and with redis messages would be lost time.sleep(0.1) + print(TerminalColors.OK_ORANGE.value + "replying " + reply + " on channel " + channel + TerminalColors.ENDC.value) + # publish self.redisclient.publish(channel, reply) diff --git a/modules/controller/controller.py b/modules/controller/controller.py index 8a40fd5402a7e2f4d1c51238ef3c06eeb85c7a0a..6790e911f1d68ad140420abb1f55b25caca3fec7 100644 --- a/modules/controller/controller.py +++ b/modules/controller/controller.py @@ -2,21 +2,20 @@ # -*- coding: utf-8 -*- import base64 import logging -# import urllib import random import string -# import tempfile import sys import traceback import simplejson +from libraries.security.user import AuraUser from libraries.base.calendar import AuraCalendarService from libraries.base.schedulerconfig import AuraSchedulerConfig -from modules.communication.redis.messenger import RedisMessenger -from libraries.security.user import AuraUser from libraries.exceptions.auraexceptions import NoProgrammeLoadedException -from modules.communication.liquidsoap.communicator import LiquidSoapCommunicator + from modules.scheduling.scheduler import AuraScheduler +from modules.communication.redis.messenger import RedisMessenger +from modules.communication.liquidsoap.communicator import LiquidSoapCommunicator """ @@ -25,7 +24,7 @@ from modules.scheduling.scheduler import AuraScheduler """ -class AuraController(): +class AuraController: messenger = RedisMessenger() liquidsoapcommunicator = None scheduler = None @@ -42,15 +41,11 @@ class AuraController(): def __init__(self, config): """ Constructor - @type sender: object - @param sender: Der Communicator Adapter - z-B. zmq - @type lqs_socket: string - @param lqs_socket: Liquidsoap Player Socket - @type lqs_recsocket: string - @param lqs_recsocket: Liquidsoap Recorder Socket + @type config: object + @param config: Die geladene aura.ini """ self.config = config - self.debug = config.get("debug") + self.debug = self.config.get("debug") # Felder die Liquidsoap fuer einen Track (rid) zurueckliefert self.knownfields = ["status", "album", "time", "title", "artist", "comment", "filename", "on_air", "source", "rid", "genre"] @@ -59,7 +54,7 @@ class AuraController(): # self.messenger.set_channel('controller') # self.messenger.set_section('execjob') - errors_file = config.get("install_dir")+"/errormessages/controller_error.js" + errors_file = self.config.get("install_dir")+"/errormessages/controller_error.js" self.errorData = simplejson.load(open(errors_file)) # create scheduler and ls_communicator @@ -92,7 +87,6 @@ class AuraController(): else: print("Got an unknown response from AuraCalendarService: "+response) - # ------------------------------------------------------------------------------------------ # def get_act_programme(self): try: diff --git a/modules/scheduling/scheduler.py b/modules/scheduling/scheduler.py index cf086387717a18870a7e3c7828f132091c2247bb..d479b9aa5c436db11d448717b2a4add051624a53 100644 --- a/modules/scheduling/scheduler.py +++ b/modules/scheduling/scheduler.py @@ -40,6 +40,7 @@ import decimal import json import traceback import sqlalchemy +import MySQLdb import sys from datetime import timedelta @@ -53,9 +54,10 @@ from libraries.base.schedulerconfig import AuraSchedulerConfig from modules.communication.redis.messenger import RedisMessenger from libraries.base.calendar import AuraCalendarService from modules.scheduling.models import ModelBroadcastEventOverrides -from libraries.database.broadcasts import ScheduleEntry +from libraries.database.broadcasts import ScheduleEntry, Model from libraries.exceptions.auraexceptions import NoProgrammeLoadedException + def alchemyencoder(obj): """JSON encoder function for SQLAlchemy special classes.""" if isinstance(obj, datetime.date): @@ -128,8 +130,24 @@ class AuraScheduler(): json_data = open(self.auraconfig.get("install_dir") + "/errormessages/scheduler_error.js") self.errorData = simplejson.load(json_data) + # init database ? + self.init_database() + self.redismessenger.send('Scheduler started', '0000', 'success', 'initApp', None, 'appinternal') + # ------------------------------------------------------------------------------------------ # + def init_database(self): + import sys + # check if tables do exist. if not create them + try: + ScheduleEntry.select_all() + except sqlalchemy.exc.ProgrammingError as e: + if e.__dict__["code"] == "f405": + Model.recreate_db() + else: + raise + + # ------------------------------------------------------------------------------------------ # # def set(self, key, value): # """ @@ -221,7 +239,7 @@ class AuraScheduler(): # when do we have to start? diff = entry.entry_start_unix - now_unix - diff = diff/1000 # testing purpose + diff = diff/100 # testing purpose # create the activation threads and run them after <diff> seconds if entry.source.startswith("linein"): @@ -295,7 +313,6 @@ class AuraScheduler(): return t return False - # ------------------------------------------------------------------------------------------ # def get_act_programme(self): programme_as_string = "" @@ -317,6 +334,37 @@ class AuraScheduler(): return message_queue + # ------------------------------------------------------------------------------------------ # + def swap_playlist_entries(self, indexes): + from_entry = None + to_entry = None + from_idx = indexes["from_index"] + to_idx = indexes["to_index"] + + for p in self.programme: + if p.programme_index == int(from_idx): + from_entry = p + + if p.programme_index == int(to_idx): + to_entry = p + + if from_entry is not None and to_entry is not None: + break + + if from_entry is None or to_entry is None: + return "From or To Entry not found!" + + swap_source = from_entry.source + from_entry.source = to_entry.source + to_entry.source = swap_source + + from_entry.store() + to_entry.store() + + self.load_programme_from_db() + + return self.get_act_programme() + # ------------------------------------------------------------------------------------------ # def __load_config__(self): """ diff --git a/modules/tools/padavan.py b/modules/tools/padavan.py index 55627d5bf6502f0b62e4960e41f2bf115fe1c965..a4ae3cb57d0bea3407383e0ddb240a576b1da2e1 100644 --- a/modules/tools/padavan.py +++ b/modules/tools/padavan.py @@ -47,14 +47,15 @@ class Padavan: elif self.args.set_volume: self.set_volume(self.args.set_volume[0], self.args.set_volume[1]) - elif self.args.move_playlist_entry: - self.move_playlist_entry(self.args.move_playlist_entry[0], self.args.move_playlist_entry[1]) + elif self.args.swap_playlist_entries: + self.swap_playlist_entries(self.args.swap_playlist_entries[0], self.args.swap_playlist_entries[1]) elif self.args.delete_playlist_entry: self.delete_playlist_entry(self.args.delete_playlist_entry) - elif self.args.move_playlist_entry: - self.move_playlist_entry(self.args.move_playlist_entry[0], self.args.move_playlist_entry[1]) +# elif self.args.add_playlist_entry: +# print("moving pl en") +# self.add_playlist_entry(self.args.move_playlist_entry[0], self.args.move_playlist_entry[1]) elif self.args.print_message_queue: self.print_message_queue() @@ -107,20 +108,23 @@ class Padavan: def fetch_new_programme(self): json_reply = self.send_and_wait_redis("aura", "fetch_new_programme", Channels.FNP_REPLY) actprogramme = simplejson.loads(json_reply) - - for entry in actprogramme: - self.stringreply += "schedule id #" + str(entry["schedule_id"]) + " and entrynumber #" + str( - entry["entry_num"]) + " starting @ " + entry["entry_start"] + " playing " + entry[ - "source"] + " and is going to stop @ " + entry["entry_end"] + "\n" + self.print_programme(actprogramme) def get_act_programme(self): json_reply = self.send_and_wait_redis("aura", "get_act_programme", Channels.GAP_REPLY) actprogramme = simplejson.loads(json_reply) - - for entry in actprogramme: - self.stringreply += "schedule id #" + str(entry["schedule_id"]) + " and entrynumber #" + str( - entry["entry_num"]) + " starting @ " + entry["entry_start"] + " playing " + entry[ - "source"] + " and is going to stop @ " + entry["entry_end"] + "\n" + self.print_programme(actprogramme) + + def print_programme(self, programme): + idx = 0 + for entry in programme: + self.stringreply += "idx: " + str(entry["programme_index"]) + \ + " --- schedule id #" + str(entry["schedule_id"]) + \ + " and entrynumber #" + str(entry["entry_num"]) + \ + " starting @ " + entry["entry_start"] + \ + " ending @ " + entry["entry_end"] + \ + " is playing " + entry["source"] + "\n" + idx = idx + 1 def init_player(self): self.stringreply = self.send_and_wait_redis("aura", "init_player", Channels.IP_REPLY) @@ -129,13 +133,15 @@ class Padavan: self.send_redis(channel, message) self.stringreply = "Message '"+message+"' sent to channel '"+channel+"'" - def move_playlist_entry(self, from_index, to_index): - return "" + def swap_playlist_entries(self, from_index, to_index): + json_reply = self.send_and_wait_redis("aura", "swap_playlist_entries " + str(from_index) + " " + str(to_index), Channels.MPE_REPLY) + actprogramme = simplejson.loads(json_reply) + self.print_programme(actprogramme) def delete_playlist_entry(self, index): return "" - def move_playlist_entry(self, from_index, to_index): + def add_playlist_entry(self, from_index, to_index): return "" def print_message_queue(self):