diff --git a/Assets/Preview.png b/Assets/Preview.png new file mode 100644 index 0000000..0c33c82 Binary files /dev/null and b/Assets/Preview.png differ diff --git a/Freedomain Livestream Scheduler.ahk b/Freedomain Livestream Scheduler.ahk index f30b91f..79e2962 100644 --- a/Freedomain Livestream Scheduler.ahk +++ b/Freedomain Livestream Scheduler.ahk @@ -64,6 +64,8 @@ global FullScriptName global PostStatusesFilepath global ErrorLoggingDirectory +global ConfirmBeforeSubmit + global DiscordErrorLoggingWebhookBotURL global DiscordVideosWebhookURL global VideoFolderDir @@ -104,12 +106,14 @@ FileInstall, Version.ini, %A_ScriptDir%\Lib\Version.ini, 1 IniRead, ScriptVersion, %A_ScriptDir%\Lib\Version.ini,%ScriptSettingsSection%, Version, 0.0 ; IniRead, ScriptName, %A_ScriptDir%\Lib\Version.ini,%ScriptSettingsSection%, Name, %ScriptSettingsSection% -global ScriptName := "Freedomain Livestream Scheduler" -global ScriptAbbreviatedName := "FLS" ; used for error logging +global ScriptName +ScriptName := "Freedomain Livestream Scheduler" + +global ScriptAbbreviatedName +ScriptAbbreviatedName := "FLS" ; used for error logging FullScriptName := ScriptName . " - " . ScriptVersion -; Msgbox % "FullScriptName: " FullScriptName global GitReleasesAPIURL GitReleasesAPIURL = https://freedomain.dev/api/v1/repos/yuriy/livestream-scheduler/releases @@ -172,13 +176,20 @@ if(ErrorLogToDiscord){ ; GUI Variables ; ------------------------------------------------ +GuiFontSize = 15 + MarginSize := 10 MarginSizeDoubled := MarginSize * 2 ButtonHeights := 30 -ThumbnailPreviewWidth := 200 +ThumbnailPreviewWidth := 150 + + + +GuiHeight := 470 + +VerticalLineHeight := GuiHeight - 100 -GuiHeight := 440 ; Column One ColumnOneWidth := 500 @@ -187,14 +198,21 @@ ColumnOneEditBoxWidth := ColumnOneWidth - (MarginSize * 2) ColumnOneEditBoxHalfWidth := (ColumnOneEditBoxWidth / 2) + 5 -GuiFontSize = 15 - ; Column Two ColumnTwoXPosition := ColumnOneWidth + (MarginSize * 2) +ColumnTwoVerticalLineXPosition := ColumnTwoXPosition - (MarginSize * 2) ColumnTwoEditBoxWidth := 200 ColumnTwoEditBoxHalfWidth := ColumnTwoEditBoxWidth / 2 +; Column Three +ColumnThreeXPosition := ColumnTwoXPosition + ColumnTwoEditBoxWidth + (MarginSizeDoubled * 2) +ColumnThreeVerticalLineXPosition := ColumnThreeXPosition - (MarginSize * 2) + +ColumnThreeEditBoxWidth := 180 + +GUIWidth := ColumnThreeXPosition + ColumnThreeEditBoxWidth + MarginSize + ; Results Screen ResultButtonWidth := 250 @@ -203,87 +221,96 @@ ResultButtonHeights := 30 ResultButtonAndEditWidth := ResultButtonWidth + ResultButtonEditWidth + MarginSize + + ; START OF GUI ; ------------------------------------------------ - -Gui, Font, s%GuiFontSize% +Gui, Margin, %MarginSize%, %MarginSize% +; Gui Color, 0193C4 ; Column One ;------------------------------------------------ - +Gui, Font, s%GuiFontSize% Gui, Font, Bold -Gui, Font, s8 -Gui, Add, Text,, Title +Gui, Add, Text,x%MarginSize%, Title + +Gui, Font, s10 Gui, Font, Normal +Gui, Add, Button, x+%MarginSize% gPasteClipboardToEditBox vPasteClipboardToFLSTitle, Paste Clipboard + Gui, Font, s%GuiFontSize% -Gui, Add, Edit,w%ColumnOneEditBoxWidth% vLivestreamTitle, %LivestreamTitle% +Gui, Font, Normal +Gui, Add, Edit,x%MarginSize% w%ColumnOneEditBoxWidth% vLivestreamTitle, %LivestreamTitle% +Gui, Font, s%GuiFontSize% Gui, Font, Bold -Gui, Font, s8 Gui, Add, Text,, Description + +Gui, Font, s10 Gui, Font, Normal +Gui, Add, Button, x+%MarginSize% gPasteClipboardToEditBox vPasteClipboardToFLSDescription, Paste Clipboard + Gui, Font, s%GuiFontSize% -Gui, Add, Edit,w%ColumnOneEditBoxWidth% h150 vLivestreamDescription, %LivestreamDescription% +Gui, Font, Normal +Gui, Add, Edit,x%MarginSize% w%ColumnOneEditBoxWidth% h170 vLivestreamDescription, %LivestreamDescription% +Gui, Font, s%GuiFontSize% Gui, Font, Bold -Gui, Font, s8 Gui, Add, Text,, Tags (Comma Seperated) + +Gui, Font, s10 Gui, Font, Normal +Gui, Add, Button, x+%MarginSize% gPasteClipboardToEditBox vPasteClipboardToFLSTags, Paste Clipboard + Gui, Font, s%GuiFontSize% -Gui, Add, Edit,w%ColumnOneEditBoxWidth% vLivestreamTags, %LivestreamTags% +Gui, Font, Normal +Gui, Add, Edit,x%MarginSize% w%ColumnOneEditBoxWidth% vLivestreamTags, %LivestreamTags% +; Buttons at Bottom of Page +; ------------------------------------------------ +; Start with Column one and go across -Gui, Font, Bold -Gui, Font, s8 -Gui, Add, Text,, Thumbnail -Gui, Add, Button, x+%MarginSize% yp-3 gSelectThumbnail, Select -Gui, Font, Normal -Gui, Font, s%GuiFontSize% -Gui, Add, Picture, x%MarginSize% w%ThumbnailPreviewWidth% h-1 vThumbnailPreview, %LivestreamThumbnail% +ScheduleButtonWidths := 234 +ScheduleButtonHeight := 50 +Gui, Font, s%GuiFontSize% Gui, Font, Bold -Gui, Font, S10 -Gui, Add, Button, x%ColumnOneEditBoxHalfWidth% yp-%marginsize% w%ColumnOneEditBoxHalfWidth% h40 gSaveAsTemplate, Save As Template -Gui, Add, Button,gSchedulePost w%ColumnOneEditBoxHalfWidth% gLoadTemplate h40 , Load Template -Gui, Font, Normal -Gui, Add, Button,gSchedulePost w%ColumnOneEditBoxHalfWidth% gLoadPrevious h20 , Load Previous +Gui, add, text, x0 y+%marginsizeDoubled% w970 0x10 -; Gui, Add, Button, yp+0 x%ColumnOneEditBoxHalfWidth% w%ColumnOneEditBoxHalfWidth%, Text button here +Gui, Add, Button, x%MarginSize% yp+%marginsizeDoubled% w%ColumnTwoEditBoxWidth% h%ScheduleButtonHeight% gLoadPrevious , Load Previous - -; Gui, Add, Edit,w%ColumnOneEditBoxWidth% h150 vLivestreamDescription, This livestream is happening soon! +Gui, Font, Bold +; Gui, Font, S10 +Gui, Add, Button, x+%marginsize% w%ScheduleButtonWidths% h%ScheduleButtonHeight% gSaveAsTemplate, Save As Template +Gui, Add, Button,x+%marginsize% gSchedulePost h%ScheduleButtonHeight% w%ScheduleButtonWidths% gLoadTemplate, Load Template +Gui, Add, Button, x+%marginsize% gSchedulePost h%ScheduleButtonHeight% w%ScheduleButtonWidths% gSchedulePost, Schedule ; Column Two ; ------------------------------------------------ +Gui, add, text, x%ColumnTwoVerticalLineXPosition% y%marginSize% h%VerticalLineHeight% 0x11 ;Vertical Line > Etched Gray + + Gui, Font, s%GuiFontSize% Gui, Font, Bold -Gui, Add, Text,y0 x%ColumnTwoXPosition%, Settings +; Gui, Add, Text, , Thumbnail +Gui, Add, GroupBox, r2.5 x%ColumnTwoXPosition% y%marginSize% vImageThumbnail w%ColumnTwoEditBoxWidth%,Thumbnail +Gui, Font, s10 Gui, Font, Normal -Gui, Font, s8 -Gui, Add, Checkbox, vErrorLogToDiscord Checked%ErrorLogToDiscord%, Error Log to Discord -Gui, Add, Checkbox, vConfirmBeforeSubmit checked%ConfirmBeforeSubmit%, Confirm Before Submit -Gui, Add, Checkbox, vAutoUpdateCheck Checked%AutoUpdateCheck%, Auto Update Check - - - +Gui, Add, Button, xp+120 yp-3 gSelectThumbnail, Select +; Gui, Font, Normal +; Gui, Font, s%GuiFontSize% +Gui, Add, Picture, x%ColumnTwoXPosition% y+%marginsize% w%ThumbnailPreviewWidth% h-1 vThumbnailPreview, %LivestreamThumbnail% -if(UpdateAvailable){ - Gui, Add, Button, cRed w%ColumnTwoEditBoxWidth% gUpdateScript vUpdateAvailable center, Update Available! -} -else, { - Gui, Add, Button, w%ColumnTwoEditBoxWidth% gUpdateScript vUpdateAvailable center, No Updates Available -} Gui, Font, s%GuiFontSize% Gui, Font, Bold -; Gui, Add, Text, , Settings -Gui, Add, Text, y+%MarginSizeDoubled% , Date and Time +Gui, Add, Text, x%ColumnTwoXPosition% yp+100 , Date and Time Gui, Font, Normal Gui, Add, DateTime, vLivestreamDate w%ColumnTwoEditBoxWidth%, MM/dd/yyyy @@ -311,13 +338,41 @@ Gui, Add, Checkbox,x%ColumnTwoXPosition% y+%marginsize% checked vRumble, Rumble Gui, Font, S8 Gui, Add, Checkbox, x+10 yp+5 Checked vInputRumbleCustomRTMP, Input RTMP +Gui, add, text, x%ColumnThreeVerticalLineXPosition% y%marginSize% h%VerticalLineHeight% 0x11 ;Vertical Line > Etched Gray -Gui, Font, s15 + +; Column Three +; ------------------------------------------------ +Gui, Font, s%GuiFontSize% Gui, Font, Bold -Gui, Add, Button, x%ColumnTwoXPosition% y+%marginsizeDoubled% gSchedulePost w%ColumnTwoEditBoxWidth% h60, Schedule -; Gui, Font, Normal +Gui, Add, Text,y0 x%ColumnThreeXPosition%, Settings + + +Gui, Font, s12 +Gui, Font, Normal +Gui, Add, Checkbox, vAutoUpdateCheck Checked%AutoUpdateCheck%, Auto Update Check +Gui, Add, Checkbox, vErrorLogToDiscord Checked%ErrorLogToDiscord%, Error Log to Discord +Gui, Add, Checkbox, vConfirmBeforeSubmit checked%ConfirmBeforeSubmit%, Confirm Before Submit + + +Gui, Font, s%GuiFontSize% +Gui, Font, Bold +Gui, Add, Text, y+%MarginSizeDoubled% x%ColumnThreeXPosition%, Updates + +Gui, Font, S10 +if(UpdateAvailable) + Gui, Add, Button, cRed w%ColumnTwoEditBoxWidth% center vUpdateAvailable gUpdateScript, FLS Update Available! +else, + Gui, Add, Button, w%ColumnThreeEditBoxWidth% center vUpdateAvailable gUpdateScript, FLS Up-to-Date + +if(ChromeUpdateAvailable) + Gui, Add, Button, cRed w%ColumnThreeEditBoxWidth% center vChromeUpdateAvailable gUpdateChrome,Chrome Update Available! +else, + Gui, Add, Button, w%ColumnThreeEditBoxWidth% center vChromeUpdateAvailable gUpdateChrome, Chrome Up-to-Date -Gui, Show, h%GuiHeight%, %FullScriptName% + + +Gui, Show, h%GuiHeight% w%GUIWidth%, %FullScriptName% @@ -413,8 +468,8 @@ ExitApp SelectThumbnail: FileSelectFile, LivestreamThumbnail, - -GuiControl, , ThumbnailPreview, *w%ThumbnailPreviewWidth% *h-1 %LivestreamThumbnail% +; Msgbox % "ThumbnailPreviewWidth: " ThumbnailPreviewWidth +GuiControl, , ThumbnailPreview, *h130 *w-1 %LivestreamThumbnail% Return @@ -595,9 +650,7 @@ if(SocialMediaPosterFilepath = "" or !FileExist(SocialMediaPosterFilepath)){ } Else IfMsgBox Cancel, { Return } - IniWrite, %SocialMediaPosterFilepath%, %SettingsIniFilepath%, Filepaths, SocialMediaPosterFilepath - } run, %SocialMediaPosterFilepath% %StatusFileFilePath% @@ -710,7 +763,7 @@ Return -#Include %A_ScriptDir%\Lib\Freedomain-Posters-Shared-Functions\Update-Functions.ahk +#Include %A_ScriptDir%\Lib\Freedomain-Posters-Shared-Functions\Shared-GoTos.ahk ; Misc diff --git a/Lib/Freedomain-Posters-Shared-Functions b/Lib/Freedomain-Posters-Shared-Functions index 0e02ae2..738e1af 160000 --- a/Lib/Freedomain-Posters-Shared-Functions +++ b/Lib/Freedomain-Posters-Shared-Functions @@ -1 +1 @@ -Subproject commit 0e02ae24bd4d909df30a58ba61693cef321fcaaa +Subproject commit 738e1af44353f55a3bd4684139381eaaf57bd8ef diff --git a/Modules/Media-Manager-Update-Redirects.ahk b/Modules/Media-Manager-Update-Redirects.ahk index 679989d..f72ddf7 100644 --- a/Modules/Media-Manager-Update-Redirects.ahk +++ b/Modules/Media-Manager-Update-Redirects.ahk @@ -5,7 +5,7 @@ MediaManagerUpdate: CurrentSite := "Media Manager" -SaveOrPostProgress(Message:="Scheduling Post in Rumble Studio",PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") +SaveOrPostProgress(Message:="Navigating to Website",PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") IniRead, FDRRadioURL, %SettingsIniFilepath%, General, FDRRadioURL, %A_Space% @@ -47,6 +47,9 @@ if(InStr(PageURL, "/NotLoggedIn")){ } +Message = Updating Redirect URLs +SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") + ; URL for each redirect LocalsLiveRedirectURL := FDRRadioBaseURL . "/manage/#/Redirects/Modify?redirectID=738" RumbleLiveRedirectURL := FDRRadioBaseURL . "/manage/#/Redirects/Modify?redirectID=739" @@ -59,15 +62,34 @@ IniRead, OdyseeLivestreamURL, %PostStatusesFilepath%, Livestream,OdyseeLivestrea +if(LocalsLivestreamURL) UpdateMediaManagerRedirect(LocalsLiveRedirectURL, LocalsLivestreamURL) +else, { + Message = LocalsLivestreamURL is blank. Skipping + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") +} + +if(RumbleLivestreamURL) UpdateMediaManagerRedirect(RumbleLiveRedirectURL, RumbleLivestreamURL) +else, { + Message = RumbleLivestreamURL is blank. Skipping + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") +} + + +if(OdyseeLivestreamURL) UpdateMediaManagerRedirect(OdyseeLiveRedirectURL, OdyseeLivestreamURL) +else, { + Message = OdyseeLivestreamURL is blank. Skipping + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") +} UpdateMediaManagerRedirect(MediaManagerRedirectPageURL, RedirectURL){ + try, driver.Get(MediaManagerRedirectPageURL) ;Open selected URL try, driver.executeScript("return document.readyState").equals("complete") ; wait until page loads completely before proceeding @@ -75,29 +97,23 @@ UpdateMediaManagerRedirect(MediaManagerRedirectPageURL, RedirectURL){ Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=RedirectURL, ClearElement := 1) - if(ConfirmBeforeSubmit){ - OnMessage(0x44, "OnMsgBoxUserConfirmation") - MsgBox 0x21, User Confirmation, Please check that all data was input correctly and fix any mistakes and then click PROCEED to finalize the Upload.`n`nClick STOP to cancel the rest of this Upload and move on to the next website. - OnMessage(0x44, "") - - IfMsgBox OK, { - - } Else IfMsgBox Cancel, { - Message = User Selected STOP button when asked for confirmation. Cancelling Rest of Site Upload. - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") - Return - } - } + ; Snippet to for check: + if (ConfirmBeforeSubmit && ConfirmBeforeSubmitMsgboxFunc() != true) { + Message = User Selected STOP button when asked for confirmation. Cancelling Rest of Site Upload. + SaveOrPostProgress(Message:=Message, PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + return + } - ; Save button - Xpath = (//span[contains(text(),'Save')])[1] - Status := Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) - if(Status){ - Message = Failed to click Save button - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") - Return - } + ; Save button + Xpath = (//span[contains(text(),'Save')])[1] + Status := Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) + if(Status){ + Message = Failed to click Save button + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return + } - Return "Success" + Sleep, 1000 + Return "Success" - } +} diff --git a/Modules/Odysee-Schedule.ahk b/Modules/Odysee-Schedule.ahk index d2f6621..c81f083 100644 --- a/Modules/Odysee-Schedule.ahk +++ b/Modules/Odysee-Schedule.ahk @@ -256,6 +256,7 @@ IniWrite, %OdyseeLivestreamURL%, %PostStatusesFilepath%, Livestream,OdyseeLivest ; Grab RTMP Settings Message = Waiting for Confirmation Screen to grab RTMP Settings +SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") Xpath = (//span[contains(text(),'View Livestream Settings')])[1] loop, 60 { @@ -269,6 +270,12 @@ loop, 60 { ; click on the "View livestream Settings" button Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=5,SleepLength:=1000) +if(Status){ + Message = Failed to click on -View Livestream Settings- Button + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return +} + ; Grab the Stream URL and Key Xpath = (//input[@name='stream-server'])[1] diff --git a/README.md b/README.md index 7df6ac8..dcb75ac 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ # Freedomain-Livestream-Scheduler Livestream Scheduler written for the [Freedomain Philosophy Show](https://freedomain.com/) + +![Alt text](Assets/Preview.png "Screenshot of Main Window") + +## Features +Automated scheduling of livestreams on the following platforms using Selenium Chrome automation. +* Odysee +* Locals +* Rumble + +- The RTMP information from each platform will be grabbed at the end of the schedule and then input into Rumble Studio for Livestreaming. \ No newline at end of file diff --git a/Version.ini b/Version.ini index 68e95ae..0ad57a0 100644 Binary files a/Version.ini and b/Version.ini differ