From 4bd4e1f7c32a33198f084d72a53b4b8d8939130b Mon Sep 17 00:00:00 2001 From: Yuriy Date: Wed, 8 May 2024 13:58:37 -0400 Subject: [PATCH] rumble functionality, bug fixes, gui improvements --- .gitignore | 3 +- Freedomain Livestream Scheduler.ahk | 98 ++++++++--- Lib/Freedomain-Posters-Shared-Functions | 2 +- Modules/Locals-Check-Login-Status.ahk | 4 +- Modules/Locals-Schedule.ahk | 12 +- Modules/Odysee-Grab-URL.ahk | 154 +++++++++++++++++ Modules/Odysee-Schedule.ahk | 108 +----------- Modules/Rumble-Schedule.ahk | 211 +++++++++++++++++++++++- Version.ini | Bin 98 -> 100 bytes 9 files changed, 459 insertions(+), 133 deletions(-) create mode 100644 Modules/Odysee-Grab-URL.ahk diff --git a/.gitignore b/.gitignore index 585cf56..fcd9c26 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,5 @@ Compile Scripts to EXE.ahk Freedomain Video Uploader.exe Lib/LBRY Process Killer.exe Lib/chrome-win64 -Lib/Version.ini \ No newline at end of file +Lib/Version.ini + diff --git a/Freedomain Livestream Scheduler.ahk b/Freedomain Livestream Scheduler.ahk index f2acb66..d84524c 100644 --- a/Freedomain Livestream Scheduler.ahk +++ b/Freedomain Livestream Scheduler.ahk @@ -49,6 +49,7 @@ CheckIfUpdateInstalled(PassedInArgument) #include %A_ScriptDir%\Lib\Freedomain-Posters-Shared-Functions\Zip.ahk #include %A_ScriptDir%\Lib\Freedomain-Posters-Shared-Functions\URLDownloadToVar.ahk #Include %A_ScriptDir%\Lib\Freedomain-Posters-Shared-Functions\Miscellaneous-Functions.ahk +#Include %A_ScriptDir%\Lib\Freedomain-Posters-Shared-Functions\LBRY-Functions.ahk @@ -163,23 +164,23 @@ ButtonHeights := 30 ThumbnailPreviewWidth := 200 -GuiHeight := 450 +GuiHeight := 550 ; Column One -ColumnOneWidth := 400 +ColumnOneWidth := 500 ColumnOneEditBoxWidth := ColumnOneWidth - (MarginSize * 2) -GuiFontSize = 10 +GuiFontSize = 15 ; Column Two ColumnTwoXPosition := ColumnOneWidth + (MarginSize * 2) ColumnTwoEditBoxWidth := 200 - +ColumnTwoEditBoxHalfWidth := ColumnTwoEditBoxWidth / 2 ; Results Screen -ResultButtonWidth := 150 +ResultButtonWidth := 250 ResultButtonEditWidth := 250 ResultButtonHeights := 30 @@ -204,7 +205,7 @@ Gui, Font, Normal Gui, Add, Edit,w%ColumnOneEditBoxWidth% h150 vLivestreamDescription, %LivestreamDescription% Gui, Font, Bold -Gui, Add, Text,, Tags +Gui, Add, Text,, Tags (Comma Seperated) Gui, Font, Normal Gui, Add, Edit,w%ColumnOneEditBoxWidth% vLivestreamTags, %LivestreamTags% @@ -229,34 +230,43 @@ Gui, Font, Bold ; Gui, Add, Text, , Settings Gui, Add, Text,y0 x%ColumnTwoXPosition%, Settings Gui, Font, Normal +Gui, Font, s8 Gui, Add, Checkbox, vConfirmBeforeSubmit checked, Confirm Before Submit Gui, Font, s%GuiFontSize% Gui, Font, Bold ; Gui, Add, Text, , Settings -Gui, Add, Text, y+%MarginSizeDoubled%, Date and Time of Livestream +Gui, Add, Text, y+%MarginSizeDoubled% , Date and Time Gui, Font, Normal Gui, Add, DateTime, vLivestreamDate w%ColumnTwoEditBoxWidth%, MM/dd/yyyy Gui, Add, DateTime, vLivestreamTime w%ColumnTwoEditBoxWidth% Choose200505311900, Time -Gui, Add, Button, gSetLivestreamTimeMorning,Morning -Gui, Add, Button,yp+0 x+%MarginSize% gSetLivestreamTimeMorning,Evening +Gui, Font, s8 +Gui, Font, Normal +Gui, Add, Button, gSetLivestreamTimeMorning yp+35 w%ColumnTwoEditBoxHalfWidth%,Morning +Gui, Add, Button,yp+0 x+0 gSetLivestreamTimeMorning w%ColumnTwoEditBoxHalfWidth%,Evening + +Gui, Font, s%GuiFontSize% Gui, Font, Bold -Gui, Add, Text,y+%MarginSizeDoubled% x%ColumnTwoXPosition%, Platform to Schedule On +Gui, Add, Text,y+%MarginSizeDoubled% x%ColumnTwoXPosition%, Platforms Gui, Font, Normal ; Gui, Add, Checkbox,, Dlive -Gui, Add, Checkbox, checked vLocals, Locals -; Gui, Add, Checkbox,checked vOdysee, Odysee + + +Gui, Add, Checkbox, vOdysee, Odysee +Gui, Add, Checkbox, vLocals, Locals +Gui, Add, Checkbox,checked vRumble, Rumble + Gui, Font, Bold -Gui, Add, Button,gSchedulePost w%ColumnTwoEditBoxWidth% y+50 gSaveAsTemplate, Save as Template +Gui, Add, Button,gSchedulePost w%ColumnTwoEditBoxWidth% gSaveAsTemplate y+50, Save as Template Gui, Add, Button,gSchedulePost w%ColumnTwoEditBoxWidth% gLoadTemplate, Load Template Gui, Font, s15 -Gui, Add, Button,gSchedulePost w%ColumnTwoEditBoxWidth% h40 y+50, Schedule +Gui, Add, Button,gSchedulePost w%ColumnTwoEditBoxWidth% h40, Schedule Gui, Font, Normal Gui, Show, h%GuiHeight% @@ -266,7 +276,7 @@ Return SetLivestreamTimeMorning: if(A_GuiControl = "Morning") -GuiControl, , LivestreamTime, 200505311130 +GuiControl, , LivestreamTime, 200505311100 if(A_GuiControl = "Evening") GuiControl, , LivestreamTime, 200505311900 Return @@ -339,6 +349,8 @@ Return SchedulePost: Gui, submit, NoHide + + ; Re-use an existing errorlog or create new directory if(InStr(PassedInArgument, "\ErrorLogging\")) CreateErrorLoggingFiles(PassedInArgument) @@ -371,10 +383,16 @@ if(Locals){ Gosub, LocalsSchedule } +if(Rumble) +gosub, RumbleSchedule + + ; msgbox, done! ; Gui, Add, +ToolTip ; hide any existing tooltips + Gui, Destroy @@ -392,24 +410,36 @@ Gui, Destroy ; ------------------------------------------------ IniRead, LocalsRTMPURL, %PostStatusesFilepath%, Livestream,LocalsRTMPURL, %A_Space% IniRead, LocalsRTMPKey, %PostStatusesFilepath%, Livestream,LocalsRTMPKey, %A_Space% -IniRead, LivestreamURL, %PostStatusesFilepath%, Livestream,LivestreamURL, %A_Space% +IniRead, LocalsLivestreamURL, %PostStatusesFilepath%, Livestream,LocalsLivestreamURL, %A_Space% +IniRead, OdyseeLivestreamURL, %PostStatusesFilepath%, Livestream,OdyseeLivestreamURL, %A_Space% +IniRead, RumbleLivestreamURL, %PostStatusesFilepath%, Livestream,RumbleLivestreamURL, %A_Space% Gui, Font, Bold Gui, Font, s%GuiFontSize% -Gui, Add, Button, x10 y+10 h%ResultButtonHeights% w%ResultButtonWidth% gResultsGUIAction, Locals URL -Gui, Add, Edit, x+5 yp+0 h%ResultButtonHeights% w%ResultButtonEditWidth% vLivestreamURL center, %LivestreamURL% - -Gui, Add, Button, x10 y+10 h%ResultButtonHeights% w%ResultButtonWidth% gResultsGUIAction, Locals RTMP URL +Gui, Add, Button,x%MarginSize% y+10 h%ResultButtonHeights% w%ResultButtonWidth% gResultsGUIAction, Locals RTMP URL Gui, Add, Edit, x+5 yp+0 h%ResultButtonHeights% w%ResultButtonEditWidth% vLocalsRTMPURL center, %LocalsRTMPURL% -Gui, Add, Button, x10 y+10 h%ResultButtonHeights% w%ResultButtonWidth% gResultsGUIAction, Locals RTMP Key +Gui, Add, Button, x%MarginSize% y+10 h%ResultButtonHeights% w%ResultButtonWidth% gResultsGUIAction, Locals RTMP Key Gui, Add, Edit, x+5 yp+0 h%ResultButtonHeights% w%ResultButtonEditWidth% vLocalsRTMPKey center, %LocalsRTMPKey% +Gui, Add, Button, x%MarginSize% y+10 h%ResultButtonHeights% w%ResultButtonWidth% gResultsGUIAction, Locals URL +Gui, Add, Edit, x+5 yp+0 h%ResultButtonHeights% w%ResultButtonEditWidth% vLocalsLivestreamURL center, %LocalsLivestreamURL% + +Gui, Add, Button, x%MarginSize% y+10 h%ResultButtonHeights% w%ResultButtonWidth% gResultsGUIAction, Odysee URL +Gui, Add, Edit, x+5 yp+0 h%ResultButtonHeights% w%ResultButtonEditWidth% vOdyseeLivestreamURL center, %OdyseeLivestreamURL% -Gui, Add, Button, gRetryUpload h%ResultButtonHeights% w%ResultButtonEditWidth%,Try Failed Again +Gui, Add, Button, x%MarginSize% y+10 h%ResultButtonHeights% w%ResultButtonWidth% gResultsGUIAction, Rumble URL +Gui, Add, Edit, x+5 yp+0 h%ResultButtonHeights% w%ResultButtonEditWidth% vRumbleLivestreamURL center, %RumbleLivestreamURL% + + +Gui, Add, Button, x%MarginSize% gResultsGUIAction h%ResultButtonHeights% w%ResultButtonEditWidth%,Copy Title +Gui, Add, Button, x+%marginsize% gResultsGUIAction h%ResultButtonHeights% w%ResultButtonEditWidth%,Copy Description +Gui, Add, Button, x%MarginSize% h%ResultButtonHeights% w%ResultButtonEditWidth%, +Gui, Add, Button, x+%marginsize% gRetryUpload h%ResultButtonHeights% w%ResultButtonEditWidth%,Try Failed Again +; Gui, Add, Button, x%MarginSize% gRetryUpload h%ResultButtonHeights% w%ResultButtonEditWidth%,Try Failed Again Gui, Show @@ -426,8 +456,23 @@ Message = Copying %A_GuiControl% to Clipboard SaveOrPostProgress(Message:=Message,PostType:="Tooltip") +if(A_GuiControl = "Copy Title"){ + Clipboard := LivestreamTitle +} +if(A_GuiControl = "Copy Description"){ + Clipboard := LivestreamDescription +} + +if(A_GuiControl = "Rumble URL"){ + Clipboard := RumbleLivestreamURL +} + +if(A_GuiControl = "Odysee URL"){ + Clipboard := OdyseeLivestreamURL +} + if(A_GuiControl = "Locals URL"){ - Clipboard := LivestreamURL + Clipboard := LocalsLivestreamURL } if(A_GuiControl = "Locals RTMP URL"){ @@ -455,11 +500,12 @@ Return - +; GoSubs for Selenium Automation +; ------------------------------------------------ #Include %A_ScriptDir%\Modules\Locals-Schedule.ahk - - #Include %A_ScriptDir%\Modules\Odysee-Schedule.ahk +#Include %A_ScriptDir%\Modules\Odysee-Grab-URL.ahk +#Include %A_ScriptDir%\Modules\Rumble-Schedule.ahk ; Misc diff --git a/Lib/Freedomain-Posters-Shared-Functions b/Lib/Freedomain-Posters-Shared-Functions index 2e0c81f..124a26c 160000 --- a/Lib/Freedomain-Posters-Shared-Functions +++ b/Lib/Freedomain-Posters-Shared-Functions @@ -1 +1 @@ -Subproject commit 2e0c81f34fa96f659153e5daba1e8be5ba28fd0c +Subproject commit 124a26c3b03e5f1292691909c20a116f64957955 diff --git a/Modules/Locals-Check-Login-Status.ahk b/Modules/Locals-Check-Login-Status.ahk index d58cf2f..e7053d6 100644 --- a/Modules/Locals-Check-Login-Status.ahk +++ b/Modules/Locals-Check-Login-Status.ahk @@ -7,8 +7,8 @@ Try, PageURL := driver.Url if(InStr(PageURL, "/register")) { LoginPageURL := LocalsPostPageURL . "/login" - Message = Website Login Expired. Trying to log back in. Navigating to: %LoginPageURL% + Message = Website Login Expired. Please log back in and then try again. SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") try, driver.Get(LoginPageURL) ;Open selected URL - + Return } diff --git a/Modules/Locals-Schedule.ahk b/Modules/Locals-Schedule.ahk index 6f59ddc..5392650 100644 --- a/Modules/Locals-Schedule.ahk +++ b/Modules/Locals-Schedule.ahk @@ -37,6 +37,12 @@ Xpath = //input[@id='title'] ; try, driver.FindElementByXPath(Xpath).SendKeys("TEST STRINGHERE") Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=LivestreamTitle) +if(Status){ + Message = Failed to input Livestream Title + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return +} + Xpath = //textarea[@id='body'] Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=LivestreamDescription) @@ -50,7 +56,7 @@ Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000 ; Create a Livestream - Second Screen ; ------------------------------------------------ ; check if "Schedule Livestream" checkbox is checked, check it if not -LivestreamScheduledCheckbox := driver.findElementByID("is_scheduled_livestream").isSelected() ;Checks if a checkbox is ticked or not and saves it to a variable, usually: 0 = Unchecked, -1 = Checked +try, LivestreamScheduledCheckbox := driver.findElementByID("is_scheduled_livestream").isSelected() ;Checks if a checkbox is ticked or not and saves it to a variable, usually: 0 = Unchecked, -1 = Checked if(LivestreamScheduledCheckbox = 0){ Xpath = //label[normalize-space()='Schedule this live stream?'] Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) @@ -63,12 +69,12 @@ if(LivestreamScheduledCheckbox = 0){ } ; Make sure the "Notify Users" checkbox is checked -NotifyUsersCheckbox := driver.findElementByID("is_do_promo").isSelected() ;Checks if a checkbox is ticked or not and saves it to a variable, usually: 0 = Unchecked, -1 = Checked +try, NotifyUsersCheckbox := driver.findElementByID("is_do_promo").isSelected() ;Checks if a checkbox is ticked or not and saves it to a variable, usually: 0 = Unchecked, -1 = Checked if(NotifyUsersCheckbox = 0){ Xpath = //label[@for='is_do_promo'] Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) - NotifyUsersCheckbox := driver.findElementByID("is_do_promo").isSelected() + try, NotifyUsersCheckbox := driver.findElementByID("is_do_promo").isSelected() if(NotifyUsersCheckbox = 0){ Message = Failed to select the "Notify Users" checkbox SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") diff --git a/Modules/Odysee-Grab-URL.ahk b/Modules/Odysee-Grab-URL.ahk new file mode 100644 index 0000000..a63728a --- /dev/null +++ b/Modules/Odysee-Grab-URL.ahk @@ -0,0 +1,154 @@ + +OdyseeGrabURL: +Iniread, OdyseeURLSLUG, %PostStatusesFilepath%, Livestream,OdyseeURLSLUG, %A_Space% + +if(OdyseeURLSLUG = ""){ + Message = OdyseeURLSLug is empty in the Livestream.ini file. + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return +} + + +Status := NavigateFromBaseURLTo("https://odysee.com/$/livestream") +if(Status) +Return + +; click on Local Setup button to switch windows +Xpath = //span[contains(text(),'Local Setup')] +Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) + + +Xpath = //label[normalize-space()='Stream server'] +try, Status := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text + +if(!Status){ + Message = Failed to switch to "Stream Server" page + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return +} + + + +/* +Message = Waiting for Livestream Created Confirmation Popup +SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") + +Xpath = //h2[normalize-space()='Livestream Created'] + +Loop, 60 { + + try, Status := ElementInnerText := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text + if(Status = "Livestream Created") + break + else, { + sleep, 1000 + Continue + } + +} + +*/ + +Message = Grabbing Livestream URL from Livestream Settings Page +SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") +/* + ; Grab and Format the livestream URL + Xpath = //li[@role='link'] + Loop, 60 { + URLSLUG := GetHTMLValueFromXpathOuterHTML(XPATH, "href") + if(URLSLug = "Failed"){ + Message = Failed to Grab URL SLug from confirmation popup + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return + } + ; Msgbox % "URLSLug: " URLSLug + if(InStr(URLSLug, OdyseeLivestreamSlug)) + break + + if(A_Index = 60){ + Message = Odysee did not generate permanant livestream URL after 1 minute of waiting. Congestion Issues? + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return + } + + sleep, 1000 + + } + */ + /*; Message = + Xpath = //span[contains(text(),'View Livestream Settings')] + Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=5,SleepLength:=1000) + if(Status){ + Message = Failed to click on View Livestream Settigns Button + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return + } + + ; Double check that we're on the right page. + Xpath = //label[normalize-space()='Stream server'] + try InnerText := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text + if(InnerText != "Stream server"){ + Message = Failed to Navigate to View Livestream Settings Page + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return + } + + + */ + + + Message = Waiting for Livestream to get confirmed and URL to be generated`nWill Give up after 5 minutes + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") + + + Xpath = //div[@class='section']//li[1] + Loop, 100 { + + if(A_Index = 100){ + Message = Failed to grab URL after 5 minutes of waiting. + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return + } + + Try ElementOuterHTML := driver.findelementbyxpath(Xpath).Attribute("outerHTML") ;XPATH-ID & Tag + + if(!InStr(ElementOuterHTML, OdyseeURLSLUG)){ + Sleep, 5000 + Continue + ; Message = Failed to Grab Livestream URL. Please copy and paste it manually. + ; SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + ; return + + } + else, { + break + } + + } + ; Clipboard := OdyseeURLSLUG + ; Msgbox % "OdyseeURLSLUG: " OdyseeURLSLUG + ; Clipboard := ElementOuterHTML + ; Msgbox % "ElementOuterHTML: " ElementOuterHTML + + + + + + Xpath = //div[@class='section']//li[1] + URLSLUG := GetHTMLValueFromXpathOuterHTML(XPATH, "href") + if(URLSLUG = "Failed"){ + Message = Failed to Grab Livestream URL from outerHTML of livestream element. + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return + } + + OdyseeLivestreamURL := "https://odysee.com" . URLSLug + ; Msgbox % "OdyseeLivestreamURL: " OdyseeLivestreamURL + + ; Message = URL Slug Grabbed from Confirmation Popup: %URLSLug% + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") + + ; OdyseeLivestreamURL := "https://odysee.com" . URLSLug + + + IniWrite, %OdyseeLivestreamURL%, %PostStatusesFilepath%, Livestream,OdyseeLivestreamURL diff --git a/Modules/Odysee-Schedule.ahk b/Modules/Odysee-Schedule.ahk index e74919f..ccd97bc 100644 --- a/Modules/Odysee-Schedule.ahk +++ b/Modules/Odysee-Schedule.ahk @@ -41,6 +41,11 @@ if(InStr(Status, "Clear")){ FormatTime, OdyseeLivestreamDate , %LivestreamDate%, MM-dd-yyyy ; _hhmmss OdyseeLivestreamSlug := "livestream-" . OdyseeLivestreamDate OdyseeURLSLUG := LBRYCMDTextReplacement(OdyseeLivestreamSlug) +IniWrite, %OdyseeURLSLUG%, %PostStatusesFilepath%, Livestream,OdyseeURLSLUG + +Xpath = (//div[@class='form-field__prefix'])[1] +try OdyseeChannelURL := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text + Message = Inputting Livestream Information SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") @@ -235,104 +240,9 @@ Xpath = //button[@aria-label='Confirm']//span[@class='button__content'] Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=5,SleepLength:=1000) -Message = Waiting for Livestream Created Confirmation Popup -SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") - -Xpath = //h2[normalize-space()='Livestream Created'] - -Loop, 60 { - - try, Status := ElementInnerText := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text - if(Status = "Livestream Created") - break - else, { - sleep, 1000 - Continue - } - -} - - -Message = Grabbing Livestream URL from Livestream Settings Page -SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") -/* - ; Grab and Format the livestream URL - Xpath = //li[@role='link'] - Loop, 60 { - URLSLUG := GetHTMLValueFromXpathOuterHTML(XPATH, "href") - if(URLSLug = "Failed"){ - Message = Failed to Grab URL SLug from confirmation popup - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") - Return - } - ; Msgbox % "URLSLug: " URLSLug - if(InStr(URLSLug, OdyseeLivestreamSlug)) - break - - if(A_Index = 60){ - Message = Odysee did not generate permanant livestream URL after 1 minute of waiting. Congestion Issues? - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") - Return - } - - sleep, 1000 - - } - */ - ; Message = - Xpath = //span[contains(text(),'View Livestream Settings')] - Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=5,SleepLength:=1000) - if(Status){ - Message = Failed to click on View Livestream Settigns Button - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") - Return - } - - ; Double check that we're on the right page. - Xpath = //label[normalize-space()='Stream server'] - try InnerText := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text - if(InnerText != "Stream server"){ - Message = Failed to Navigate to View Livestream Settings Page - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") - Return - } - - - - Xpath = //div[@class='section']//li[1] - Try ElementOuterHTML := driver.findelementbyxpath(Xpath).Attribute("outerHTML") ;XPATH-ID & Tag - ; Clipboard := OdyseeURLSLUG - ; Msgbox % "OdyseeURLSLUG: " OdyseeURLSLUG - ; Clipboard := ElementOuterHTML - ; Msgbox % "ElementOuterHTML: " ElementOuterHTML - - - if(!InStr(ElementOuterHTML, OdyseeURLSLUG)){ - Message = Failed to Grab Livestream URL. Please copy and paste it manually. - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") - return - - } - - - Xpath = //div[@class='section']//li[1] - URLSLUG := GetHTMLValueFromXpathOuterHTML(XPATH, "href") - if(URLSLUG = "Failed"){ - Message = Failed to Grab Livestream URL from outerHTML of livestream element. - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") - Return - } - - OdyseeLivestreamURL := "https://odysee.com" . URLSLug - ; Msgbox % "OdyseeLivestreamURL: " OdyseeLivestreamURL - - ; Message = URL Slug Grabbed from Confirmation Popup: %URLSLug% - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") - - ; OdyseeLivestreamURL := "https://odysee.com" . URLSLug - - - IniWrite, %OdyseeLivestreamURL%, %PostStatusesFilepath%, Livestream,OdyseeLivestreamURL +OdyseeLivestreamURL := "https://" . OdyseeChannelURL . OdyseeURLSLUG +; OdyseeURL := "https://" . OdyseeURL +IniWrite, %OdyseeLivestreamURL%, %PostStatusesFilepath%, Livestream,OdyseeLivestreamURL - Return \ No newline at end of file +Return \ No newline at end of file diff --git a/Modules/Rumble-Schedule.ahk b/Modules/Rumble-Schedule.ahk index 4f90962..c7b8ed4 100644 --- a/Modules/Rumble-Schedule.ahk +++ b/Modules/Rumble-Schedule.ahk @@ -1,5 +1,5 @@ -RumbleUpload: +RumbleSchedule: ;------------------------------------------------ CurrentSite := "Rumble" @@ -38,6 +38,215 @@ if(InStr(CurrentURL, "/sso/auth/consent")){ +; Schedule New Stream +; ------------------------------------------------ +Message = Scheduling new stream and inputting information +SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile") + +; Schedule new stream +; Schedule a stream button +Xpath = //div[normalize-space()='Schedule a stream'] +Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) + + +Xpath = (//h2[normalize-space()='Select a template (optional)']) +try ElementInnerText := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text +if(!ElementInnerText){ + Message = Templates Subwindow did not show up + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") + Return +} + + + + +loop, 3 { + Xpath = (//div[@class='flex items-center justify-between gap-x-8 p-4 bg-indigo rounded-xl'])[%A_Index%] + try, ElementText := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text + + ; use the template with "Freedomain Livestream in the name" + if(InStr(ElementText, "Freedomain Livestream")){ + Xpath = (//span[contains(text(),'Select')])[1] + Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) + if(Status){ + Message = Failed to Select Livestream Template + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return + } + } + +} + +; input thumbnail +if(Livestreamthumbnail){ + + Xpath = //input[@id='room-thumbnail'] + Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=Livestreamthumbnail) + if(Status){ + Message = Faied to upload custom thubmanil + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return + } +} + + + +; input Livestream Title +Xpath = //input[@placeholder='Give your stream a name'] +Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=LivestreamTitle, ClearElement:=1) + +; input Livestream Description +Xpath = //textarea[@placeholder='Tell the audience more about your stream'] +Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=LivestreamDescription, ClearElement:=1) + + + +; Input Date & Time +; ------------------------------------------------ +; Create variables with time and date of timestream +FormatTime, RumbleLivestreamDate , %LivestreamDate%, dddd, MMMM +FormatTime, LivestreamOrdinalDay , %LivestreamDate%, d +FormatTime, RumbleLivestreamYear , %LivestreamDate%, yyyy + +LivestreamOrdinalDay := GetDateOrdinalSuffix(LivestreamOrdinalDay) +; Msgbox % "LivestreamOrdinalDay: " LivestreamOrdinalDay + +RumbleLivestreamDate := RumbleLivestreamDate . " " . LivestreamOrdinalDay . ", " . RumbleLivestreamYear +; Msgbox % "RumbleLivestreamDate: " RumbleLivestreamDate +; Msgbox % "RumbleLivestreamDate: " RumbleLivestreamDate + + +FormatTime, RumbleLivestreamTime , %LivestreamTime%, h:mm tt +; Msgbox % "RumbleLivestreamTime: " RumbleLivestreamTime +; FormatTime, RumbleLivestreamYear , %LivestreamDate%, yyyy + +; click on box to open time picker dialogue +Xpath = //input[@placeholder='Pick a time'] +Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) + +; generate xpath based on date and click element +Xpath = //div[@aria-label='Choose %RumbleLivestreamDate%'] +Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) +if(Status){ + Message = Failed to select date from popup menu using generated xpath.`nXpath = %Xpath% + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return +} + +; generate xpath based on time and click element +Xpath = //li[normalize-space()='%RumbleLivestreamTime%'] +Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) +if(Status){ + Message = Failed to select time from popup menu using generated xpath.`nXpath = %Xpath% + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return +} + + + +; Select Channel for Upload +; ------------------------------------------------ +; click channel dropdown +Xpath = //span[@class='text-light truncate text-mini'] +Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) +if(Status){ + Message = Failed to click on Channel dropdown menu + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return +} + +; Grab inner text of all items in the channel select drop down menu +xpath = (//div[@class='shadow-md rounded-lg overflow-x-hidden bg-indigo'])[1] +try ElementInnerText := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text + +; pull out name of first channel in dropdown +FirstChannelName := StrSplit(ElementInnerText, "`n")[1] + +Xpath = (//span[normalize-space()='%FirstChannelName%'])[1] +Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) +if(Status){ + Message = Failed to select the channel -%FirstChannelName%- from Channel dropdown menu + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + return +} + + + +; Select each Secondary Platform checkbox +; ------------------------------------------------ +Loop, 10 { + + IndexPlusOne := A_index + 1 + Xpath = (//div[@class='flex shrink-0 items-center gap-x-4'])[%A_index%] + XpathCheckbox = (//div[@class='relative shrink-0'])[%IndexPlusOne%] + + + try SecondaryPlatformCheckboxName := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text + + if(SecondaryPlatformCheckboxName = "Add new destination" OR SecondaryPlatformCheckboxName = ""){ + Break + } + + Status := Selenium_LoopToClickXpath(Xpath:=XpathCheckbox,NumOfLoops:=2,SleepLength:=1000) + if(Status){ + Message = Failed to check off the checkbox for: %SecondaryPlatformCheckboxName% + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + } + + sleep, 250 + +} + + +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 automation for this site. + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return + } + } +/* +*/ + +; click the "next" button to finalize the upload +Xpath = (//button[@class='rounded-full px-6 py-2 bg-primary hover:brightness-[0.92] cursor-pointer'])[1] +Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) +if(Status){ + Message = Failed to click "Next" to finalize the upload + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") +} + + + +try, driver.get("https://rumble.com/account/live-streaming") + +Xpath = (//a[normalize-space()='Livestream Coming Soonish!'])[1] +; Try ElementOuterHTML := driver.findelementbyxpath(Xpath).Attribute("outerHTML") ;XPATH-ID & Tag + +RumbleURLSlug := GetHTMLValueFromXpathOuterHTML(XPATH, "href") +if(RumbleURLSlug = "" or RumbleURLSlug = "Failed"){ + Message = Failed to grab Rumble URL Slug from Livestreams Page + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return +} + +RumbleLivestreamURL := "https://rumble.com" . RumbleURLSlug + +IniWrite, %RumbleLivestreamURL%, %PostStatusesFilepath%, Livestream,RumbleLivestreamURL + + +return + + + + + diff --git a/Version.ini b/Version.ini index 6ead315ba07605466c9ebe8be237190a27282080..8e1363ff901681938f52f1ad8b2a4a6a3b041ef4 100644 GIT binary patch delta 11 ScmYdFnGnZj$iU0M#Q*>i!2$yS delta 9 QcmYdEnh?jr%fQ6|01X`h&;S4c