Compare commits

...

49 Commits
3.32 ... main

Author SHA1 Message Date
Yuriy 199fbc1b78 version 4 weeks ago
Yuriy 9c52c6ec8d Merged Telegram and Discord buttons together. 4 weeks ago
Yuriy 959a81bf98 Disabled Rumble channel selection 2 months ago
Yuriy ce9f8a9885 fixed discord messages having double links 4 months ago
Yuriy 71c4093bd9 generate new errorlog.txt if one from previous run is not available on filesystem 4 months ago
Yuriy ba33d479ac code cleanup, fixed Telegram not outputting API Reponse to errorlog.txt 4 months ago
Yuriy da34b98324 Fixed some items not being logged to errorlog.txt 4 months ago
Yuriy 9e76ace3c3 readme 4 months ago
Yuriy fd0b620e23 minor code cleanups 4 months ago
Yuriy c7924f7cc7 minor code clearup and errorlogging additions 4 months ago
Yuriy 8b43ddc8be Automated New Releases Process 4 months ago
Yuriy dbdefc5a95 Initial version of Release Automation 4 months ago
Yuriy 613f9d222a Fixed errorout when bitchute or brighteon URLs missing 4 months ago
Yuriy f3817cb9f9 fixed bitchute URL missing solidus 4 months ago
Yuriy 478f8f769e fixed bitchute 4 months ago
Yuriy 1b856287df bitchute update 4 months ago
Yuriy 45e2d2b0f0 readme 5 months ago
Yuriy 76d410e4d3 code cleanup 5 months ago
Yuriy ee21a03d55 check Bitchute URl and Brighteon URL for processing status and skip them in Discord + Telegram if still processing 5 months ago
Yuriy 540a688733 Set LBRY URL Slug to be regenerated each time a project is loaded and not saved between runs in case title.txt file is changed 5 months ago
Yuriy be75660548 added double check for Locals Notify Users checkbox 5 months ago
Yuriy 9f1388160c readme 5 months ago
Yuriy 4ce82bde6a fixed thumbnail not being found if it's file name changes between runs 5 months ago
Yuriy d1e471bd26 added Aspect Ratio check for Brighteon, and set brighteon check status appropriately, added video info to errorlog 5 months ago
Yuriy f5ffe32766 readme 5 months ago
Yuriy dcd947b136 Check notify users checkbox 5 months ago
Yuriy 4476bfdda6 fixed grabbing Locals Video Share Link 5 months ago
Yuriy 5f63640185 fixed grabbing Locals Video Share Link 5 months ago
Yuriy 6639c907c9 Rumble Primary Category input 5 months ago
Yuriy 3492ecccee moved saving of LastPost ini var to before gui shows 5 months ago
Yuriy 38a579c486 Locals hide link preview 5 months ago
Yuriy 4beb83caa6 reworked discord message formatting, code cleanup 5 months ago
Yuriy b98ae5e190 Added API Responses to ErrorLog.txt files 5 months ago
Yuriy ba0bf308b4 added ability to schedule an upload for a later time 5 months ago
Yuriy 58d80bd084 fixed LBRY Killer sometimes killing LBRY before URL has been grabbed 6 months ago
Yuriy 8b1a8d407c gui updates, code cleanups, initial support for post scheduling 6 months ago
Yuriy b59bfbe2cf modularized update check and made it run asynchronously 6 months ago
Yuriy c4b2eeea8e removed transcript hyperlink from telegram posts 7 months ago
Yuriy 723dec3fac removed all instances of ReuseTabs var 7 months ago
Yuriy c60a45445c gui updated after podcast is uploaded 7 months ago
Yuriy fa43716ebe fixed update available not showing in GUI 7 months ago
Yuriy ef3cb41e9c added box for Unauthorized.tv to results GUI and added ability to input url into podcasts backend 7 months ago
Yuriy 777cfaa242 reworked telegram posting, add transcript URL to GUI, Added Transcript and fdrpodcast hyperlinsk to telegram and discord posts 7 months ago
Yuriy dd7c85e22e fixed Brighteon description getting input multiple times 9 months ago
Yuriy ca0b6ce1b7 added double check to Bitchute tag input 10 months ago
Yuriy a576a194c1 added support for Video Summaries 10 months ago
Yuriy 9cbe1410e5 removed testing line 10 months ago
Yuriy f339ede04c added a second upload attempt if description input fails 10 times 10 months ago
Yuriy 4f4361276f removed telegram video upload option. Never used and only works on videos less than 50mb 10 months ago

4
.gitignore vendored

@ -19,3 +19,7 @@ Freedomain Video Uploader.exe
Lib/LBRY Process Killer.exe
Lib/chrome-win64
Lib/Version.ini
Lib/Version-FVU.ini
Lib/Version-FPS.ini
**/Scheduled-Posts
Freedomain Post Scheduler.exe

Before

Width:  |  Height:  |  Size: 302 KiB

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 KiB

@ -0,0 +1,164 @@
;---ENVIRONMENT---------------------------------------------------------------------
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
;#Warn ; Enable warnings to assist with detecting common errors.
;DetectHiddenWindows, On
#SingleInstance, Force
DetectHiddenWindows, ON
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
;SetKeyDelay, 500
CoordMode, ToolTip, Screen
CoordMode, Mouse, Screen
; #NoTrayIcon
; Menu, Tray, Icon, RMScriptManager.ico
;---Notes/Extra Info/#Includes------------------------------------------------------
#Include, %A_ScriptDir%\Lib\Freedomain-Posters-Shared-Functions\WindowCredentialManager.ahk
;---VARIABLES-----------------------------------------------------------------------
ProgramName = Freedomain Video Uploader
ExeProgramName = %ProgramName%.exe
AHKFilepath = %A_ScriptDir%\%ProgramName%.ahk
Exefilepath = %A_ScriptDir%\%ProgramName%.exe
icopath = %A_ScriptDir%\Assets\Icon.ico
VersionIniFP = %A_ScriptDir%\Version.ini
; Generate a new errorlog text file each run
FormatTime, TodayDate , YYYYMMDDHH24MISS, yyyyMMdd_hhmmss
ErrorLogFilepath = %A_ScriptDir%\Lib\ErrorLogging\Compiler_%TodayDate%.txt
; Read Credential token from Windows Credential Manager using WindowCredentialManager.ahk
cred := CredRead("FDR-Gitea-Token")
GiteaToken := Cred.Password
; Info for Creating the Release with Gitea-CreateRelease.ps1
CreateReleasePS1Filepath = %A_ScriptDir%\Lib\Freedomain-Posters-Shared-Functions\Gitea-CreateRelease.ps1
CreateReleaseAPIURL = https://freedomain.dev/api/v1/repos/yuriy/video-uploader/releases?token=%GiteaToken%
; Info for Attaching exe file to release using Gitea-AttachAssetToRelease.ps1
AttachAssetToReleasePS1Filepath = %A_ScriptDir%\Lib\Freedomain-Posters-Shared-Functions\Gitea-AttachAssetToRelease.ps1
AttachAssetToReleaseAPIURL = https://freedomain.dev/api/v1/repos/yuriy/video-uploader/releases
;---\VARIABLES-----------------------------------------------------------------------
; Compile to .exe
; ------------------------------------------------
; Bump the version number in the version.ini file
IniRead, VersionNumber, %VersionIniFP%, Video-Uploader, Version, 0.0 ; , Filename, Section, Key [, Default]
VersionNumber += .01
VersionNumber := SubStr(VersionNumber, 1, 4)
IniWrite, %VersionNumber%, %VersionIniFP%,Video-Uploader, Version
; Kill any active intances of the uploaders so the .exe file can be overwriten by the compilation
process, close, %ExeProgramName%
sleep, 500
; Delete the .exe file so it can be repalced
if(FileExist(Exefilepath)){
FileDelete, %Exefilepath%
if(ErrorLevel){
msgbox, failed to delete Exe file. Please delete manually and re-run the compiler.
ExitApp
}
}
; check if file exists and if not, give user error and stop
if(!FileExist(AHKFilepath)){
msgbox, %AHKFilepath% does not exist`nExiting
ExitApp
}
; check if file exists and if not, give user error and stop
if(!FileExist(icopath)){
msgbox, %icopath% does not exist`nExiting
ExitApp
}
; run, %comspec% /c ""C:\Program Files\AutoHotkey\Compiler\Ahk2Exe.exe" /in "%AHKFilepath%" /out "%exefilepath%" /icon "%icopath%""
Command = "C:\Program Files\AutoHotkey\Compiler\Ahk2Exe.exe" /in "%AHKFilepath%" /out "%exefilepath%" /icon "%icopath%"
Results := RunCMD(Command)
LogToErrorLogFile(Results, ErrorLogFilepath)
if(!InStr(Results, "Successfully")){
Msgbox, Error, Compilation failed with the following error:`n`n%Results%
ExitApp
}
; Create new Release on Gitea using Gitea-CreateRelease.ps1
; ------------------------------------------------
InputBox, ReleaseBody, Release Body, Please Input Text to be used in the Release Body
ReleaseName := VersionNumber
ReleaseTag := VersionNumber
; Strings with spaces in them need to be surrounted by a single quote and double quote, eg: "'spaced string'"
Command = Powershell "%CreateReleasePS1Filepath%" "%CreateReleaseAPIURL%" "%ReleaseName%" "%ReleaseTag%" "'%ReleaseBody%'"
Message = PowerShell Command to Create Release:`n%Command%
LogToErrorLogFile(Message, ErrorLogFilepath)
Results := RunCMD(Command)
Message = API Returned:`n%Results%
LogToErrorLogFile(Message, ErrorLogFilepath)
; Pull out the release ID Number, needed for attaching a file to the release
SplitText = @{id=
SplitText2 = `;
ReleaseID := StrSplit(Results, SplitText)[2]
ReleaseID := StrSplit(ReleaseID, SplitText2)[1]
if(ReleaseID = ""){
Message = Failed to Grab Release ID`nPlease See Errorlog for Details:`n%ErrorLogFilepath%
LogToErrorLogFile(Message, ErrorLogFilepath)
Msgbox, %Message%
Return
}
Message = ReleaseID: %ReleaseID%
LogToErrorLogFile(Message, ErrorLogFilepath)
; Attach .exe File to Release using Gitea-AttachAssetToRelease.ps1
; ------------------------------------------------
AttachAssetToReleaseAPIURL = %AttachAssetToReleaseAPIURL%/%ReleaseID%/assets
; Strings with spaces in them need to be surrounted by a single quote and double quote, eg: "'spaced string'"
Command = Powershell "%AttachAssetToReleasePS1Filepath%" "%AttachAssetToReleaseAPIURL%" "%GiteaToken%" "'%ExeProgramName%'" "'%Exefilepath%'"
LogToErrorLogFile(Command, ErrorLogFilepath)
Results := RunCMD(Command)
Message = API Returned: %Results%
LogToErrorLogFile(Message, ErrorLogFilepath)
ExitApp
;---FUNCTIONS-----------------------------------------------------------------------
LogToErrorLogFile(Text, TextFileFilepath){
FileAppend, `n%Text%`n, %TextFileFilepath%
}

@ -14,22 +14,8 @@ CoordMode, Mouse, Screen
;---Notes/Extra Info/#Includes------------------------------------------------------
; msgbox
;---VARIABLES-----------------------------------------------------------------------
/*ScriptToCompile = %1%
CompileType = %2% ; Testing OR Production
if(CompileType = "")
CompileType = Testing
; Msgbox % "CompileType: " CompileType
if(ScriptToCompile = "")
ExitApp
*/
; Msgbox % "ScriptToCompile: " ScriptToCompile
ScriptToCompile = SocialMediaPoster
; ScriptToCompile = ScriptUpdater
;---MAIN SCRIPT---------------------------------------------------------------------
AHKFilepath = %A_ScriptDir%\Freedomain Video Uploader.ahk
@ -77,9 +63,6 @@ if(!FileExist(icopath)){
run, %comspec% /c ""C:\Program Files\AutoHotkey\Compiler\Ahk2Exe.exe" /in "%AHKFilepath%" /out "%exefilepath%" /icon "%icopath%""
; OldNotify(ScriptToCompile,"Compiled Successfully",5)
; sleep, 5000
ExitApp

File diff suppressed because it is too large Load Diff

@ -1 +1 @@
Subproject commit e32fe026e952738a1ebda7cf81c626d0528fa660
Subproject commit 95bda715cb2bf2d9dd062e37e61d2dd0a281fcc3

@ -6,13 +6,24 @@ Message = Starting Upload
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
Status := NavigateFromBaseURLTo("https://www.bitchute.com/myupload", "BitChute Video Uploader")
Status := NavigateFromBaseURLTo("https://www.bitchute.com/")
if(Status)
Return
Message = Checking Login Status
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
Xpath = (//div[normalize-space()='Sign in'])[1]
try LoginStatus := driver.findelementbyxpath(Xpath).Attribute("innerText")
if(LoginStatus = "Sign In"){
Message = Logged out. Trying to Log Back In
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
}
/*
try TabUrl := driver.url
if(InStr(TabUrl, "/accounts/login/")){
if(AutoLogin){
@ -35,10 +46,33 @@ if(InStr(TabUrl, "/accounts/login/")){
}
}
*/
CheckForAlerts()
if(BitchuteUploadUploadURL = "")
{
; click on video upload icon so dropdown menu appears
Xpath = (//i[normalize-space()='video_call'])[1]
Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000)
; grab upload url from dropdown menu
Xpath = (//a[@id='id_upload_video'])[1]
UploadURL := GetHTMLValueFromXpathOuterHTML(XPATH, "href")
if(!InStr(UploadURL, "https")){
Message = Failed to Grab Upload Page URL from Home Page
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
Return
}
UploadURL := StrReplace(UploadURL, "api.bitchute", "old.bitchute")
}
try, driver.Get(UploadURL) ;Open selected URL
try, driver.executeScript("return document.readyState").equals("complete") ; wait until page loads completely before proceeding
Message = Inputting Title
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile")
@ -124,17 +158,28 @@ Loop, 10 { ; Attempt to input video description a couple of times
Message = Inputting Tags
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
; Convert tags into #hasthtags
; Get first 3 tags from Video Tags array
Loop, 3 {
BitchuteTags .= VideoTagsArray[A_Index] . " "
BitchuteTags .= ArrayOfVideoTags[A_Index] . " "
}
Message = Inputting Tags: %BitchuteTags%
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
; input Search Terms (Tags)
Xpath = //input[@placeholder='Search Terms']
Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=BitchuteTags)
if(Status){
Message = Failed to input search terms (tags)
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
Message = Failed to input search terms (tags)
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
}
js = return document.querySelector("#hashtags").value;
try CurrentHashTagValue := driver.executeScript(JS) ;Execute Javascript
if(CurrentHashTagValue = ""){
Message = Tags that got input into page: %CurrentHashTagValue%
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
}
@ -261,7 +306,6 @@ try driver.executeScript("history.go(0)") ;refresh page
try FirstResultVideoTitle := driver.findElementsByClass("channel-videos-title").item[1].Attribute("innerText") ; Grabb innertext
; msgbox % FirstResultVideoTitle = VideoTitle
try FirstResultIDAndTag := driver.findElementsByClass("channel-videos-title").item[1].Attribute("outerHTML") ;XPath: ID=site-title & span tag
; Msgbox % "FirstResultIDAndTag: " FirstResultIDAndTag
@ -276,9 +320,10 @@ if(VideoHref = ""){
Return
}
BitChuteURL := "https://www.bitchute.com/" . VideoHref
BitChuteURL := "https://old.bitchute.com/" . VideoHref
BitChuteURL := StrReplace(BitchuteURL, "//video", "/video")
; navigate to video page
try driver.Get(BitChuteURL) ;Open selected URL
driver.executeScript("return document.readyState").equals("complete") ; wait until page loads completely before proceeding
@ -305,6 +350,9 @@ SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,Disc
Xpath = //button[normalize-space()='Save']
Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000)
BitChuteURL := StrReplace(BitchuteURL, "old.", "")
Message = Upload Complete:`n%BitChuteURL%
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
IniWrite, %BitChuteURL%, %VideoLinksIniFile%, URLs, BitChuteURL

@ -8,7 +8,8 @@ Return
JSBrighteonVideoDescription := FormatTextToJSText(VideoDescription)
; Msgbox % "JSBrighteonVideoDescription: " JSBrighteonVideoDescription
; descriptions longer than 5k characters just fail to get input so trim them to below 5000 characters
if(StrLen(VideoDescription) >= 5000){
@ -62,14 +63,6 @@ if(InStr(CurrentTab, "login")) ; we're logged out
Message = Trying to Log Back In
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile, DiscordErrorLogging")
; js = return document.querySelector("input[placeholder='username/email']").value;
; status := try driver.executeScript(JS) ;Execute Javascript
; sleep, 5000
; Msgbox % "status: " status
; if(StrLen(Status) > 0){
; msgbox, clicking login button
Xpath = //a[normalize-space()='Log In'] ; click login button at top right of page
Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000)
@ -79,8 +72,6 @@ if(InStr(CurrentTab, "login")) ; we're logged out
try driver.executeScript("return document.readyState").equals("complete")
sleep, 2000
; }
}
else, {
@ -88,7 +79,7 @@ if(InStr(CurrentTab, "login")) ; we're logged out
SaveDriverURLOFErrorPage()
Return
}
}
}
}
@ -112,6 +103,10 @@ try driver.FindElementByXPath(Xpath).click()
CheckForAlerts()
if(BrighteonUploadAttempt){
Sleep, 2000
}
Message = Uploading Video
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile")
; Upload Video
@ -133,6 +128,25 @@ loop, 3 {
}
; input with js. Doesn't work in production, but does in the ConnectActiveTab script
/*
SaveOrPostProgress(Message:="Inputting title with JS",PostType:="Tooltip")
; Input Title of the Video
js = document.querySelector("#name").value = "%JSVideoDescription%";
driver.executeScript(JS) ;Execute Javascript
SaveOrPostProgress(Message:="Waiting 5 seconds to check if input was saved",PostType:="Tooltip")
sleep, 5000
Xpath = //input[@id='name']
try driver.FindElementByXPath(Xpath).SendKeys(driver.Keys.SPACE)
try driver.FindElementByXPath(Xpath).SendKeys(driver.Keys.BACKSPACE) ;Sends Variable to an Xpath Item
*/
; Input Title of the Video
Xpath = //input[@id='name']
try driver.FindElementByXPath(Xpath).SendKeys(VideoTitle) ;Sends Variable to an Xpath Item
@ -162,13 +176,24 @@ loop, 3 {
TooltipThis("Inputting Video Description")
; Attempt to input video description a couple of times
; Attempt to input video description multiple time in case Brighteon rejects the input
Loop, 10 {
if(A_index = 10){
Message = Failed to input Video Description after 10 attempts.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
if(!BrighteonUploadAttempt){
Message = Re-Trying Entire Upload
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
BrighteonUploadAttempt := 2
goto, BrighteonUpload
}
Message = Brighteon Upload Failed after 2 seperate individual attempts. Please try uploading manually and report any errors.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
SaveDriverURLOFErrorPage()
Return
}
@ -187,8 +212,8 @@ Loop, 10 {
sleep, 5000
js = return document.querySelector("div[class='e-content e-lib e-keyboard'] p").innerText;
; get text that was input into description box
js = return document.querySelector("#richtexteditor_747903514_0rte-view").innerText;
try Input_Description := driver.executeScript(JS) ;Execute Javascript
Input_DescriptionStrLen := StrLen(Input_Description)
@ -218,9 +243,9 @@ if(VideoThumbFilepath != "") {
; Brighteon has a max of 25 for tags.
if(VideoTagsArray.Length() > 25){
if(ArrayOfVideoTags.Length() > 25){
Loop % 24 {
BrighteonKeywords := VideoTagsArray[A_Index]
BrighteonKeywords := ArrayOfVideoTags[A_Index]
}
}
else,

@ -246,10 +246,10 @@ SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,Disc
; DailyMotion page automtically splits the tags into individual tags when they're seperated by commas
; Iterate from one end of the array to another:
Loop % VideoTagsArray.Length(){
Loop % ArrayOfVideoTags.Length(){
; ArrayItem := ARRAY[A_Index]
; MsgBox %
DailyMotionVideoTags .= VideoTagsArray[A_Index] . ","
DailyMotionVideoTags .= ArrayOfVideoTags[A_Index] . ","
}

@ -1,55 +1,62 @@
;---GUI Variables---
;------------------------------------------------
SetGUIVariables:
GuiHeight = 800
GuiWidth = 1366
GuiFontSize = 10
ButtonHeights := 30
ResultsActionButtonHeights := 50
MarginSpace := 10
MarginSpaceDoubled := MarginSpace * 2
MarginSpaceTripled := MarginSpace * 3
MarginSize := 10
MarginSizeDoubled := MarginSize * 2
MarginSizeTripled := MarginSize * 3
EditBoxWidths := (GuiWidth / 100) * 60
EditBoxHalfWidths := (EditBoxWidths / 2) - (MarginSpace / 2)
EditBoxHalfWidths := (EditBoxWidths / 2) - (MarginSize / 2)
OdyseeURLSlugEditWidth := (EditBoxHalfWidths / 4) * 3
PodcastNumberTextXPos := EditBoxHalfWidths + OdyseeURLSlugEditWidth + (MarginSpace * 3)
PodcastNumberEditWidth := (EditBoxHalfWidths / 4) - MarginSpace
PodcastNumberTextXPos := EditBoxHalfWidths + OdyseeURLSlugEditWidth + (MarginSize * 3)
PodcastNumberEditWidth := (EditBoxHalfWidths / 4) - MarginSize
EditBoxOneFourthWidth := (EditBoxWidths / 4 )
EditBoxThreeFourthsWidth := (EditBoxWidths / 4 ) * 3
ColumnOneHalfWidthXPos := EditBoxHalfWidths + MarginSpaceDoubled
ColumnOneHalfWidthXPos := EditBoxHalfWidths + MarginSizeDoubled
EditBoxThirdsWidths := (EditBoxWidths / 3) - (MarginSpace / 2)
OdyseeURLSlugXPos := EditBoxHalfWidths + (MarginSpace * 2)
EditBoxThirdsWidths := (EditBoxWidths / 3) - (MarginSize / 2)
OdyseeURLSlugXPos := EditBoxHalfWidths + (MarginSize * 2)
EditBoxFourthWidths := (EditBoxWidths / 4) - (MarginSpace - 2)
VideoTagsTextXPos := EditBoxHalfWidths + (MarginSpace * 2)
EditBoxFourthWidths := (EditBoxWidths / 4) - (MarginSize - 2)
VideoTagsTextXPos := EditBoxHalfWidths + (MarginSize * 2)
; EditBoxHalfWidthsWithMargin := (EditBoxWidths / 2)
DescriptionCharCountXPos := EditBoxWidths - 40
DescriptionCharCountXPos := EditBoxHalfWidths - 40
PageTwoXStartPos := EditBoxWidths + 50
CopyButtonWidths := 150
ResultEditBoxXPos := CopyButtonWidths + MarginSpace + 5
ResultEditBoxWidths := EditBoxWidths - CopyButtonWidths
ResultEditBoxXPos := CopyButtonWidths + MarginSize + 5
ResultEditBoxWidth := EditBoxWidths - ( CopyButtonWidths)
ResultEditBoxHalfWidths := (ResultEditBoxWidths / 2) - (MarginSpace /2)
ResultLBRYURLEditBoxWidthPieces := (ResultEditBoxWidths / 4)
ResultLBRYURLEditBoxWidths := ResultLBRYURLEditBoxWidthPieces * 3
ResultsEditAndCopyButtonWidth := CopyButtonWidths + ResultEditBoxWidth + MarginSize
ResultsGUIWidth := ResultsEditAndCopyButtonWidth + ErrorLogEditBoxWidth + MarginSize
ResultEditBoxThirdsWidths := (ResultEditBoxWidths / 3) - (MarginSpace /3)
ErrorLogEditBoxXPos := ResultEditBoxWidth + CopyButtonWidths + 30
ErrorLogEditBoxHeight := ButtonHeights * 14 + (MarginSize * 9)
ErrorLogEditBoxWidth := 330
ResultLBRYThumbEditBoxWidth := ResultLBRYURLEditBoxWidthPieces - 5
ErrorLogEditBoxXPos := ResultEditBoxWidths + CopyButtonWidths + 30
ErrorLogEditBoxHeight := GuiHeight - (MarginSpace * 20) - (ButtonHeights * 2)
ErrorLogEditBoxWidth := GuiWidth - ErrorLogEditBoxXPos - (MarginSpace * 12)
ResultEditBoxHalfWidths := (((ResultEditBoxWidth + CopyButtonWidths)) - (MarginSize * 3))
ResultLBRYURLEditBoxWidthPieces := (ResultEditBoxWidth / 4)
ResultLBRYURLEditBoxWidths := ResultLBRYURLEditBoxWidthPieces * 3
ResultEditBoxThirdsWidths := (ResultEditBoxWidth / 3) - (MarginSize /3)
ResultsScreenOneThirdsWidth := (ResultEditBoxWidth + CopyButtonWidths + ErrorLogEditBoxWidth) / 3
ResultLBRYThumbEditBoxWidth := ResultLBRYURLEditBoxWidthPieces - 5
ButtonWidths := 150
@ -67,11 +74,11 @@ PageTwoGroupBoxWidth := ThumbnailPreviewWidth + 20
VideoDescriptionEditBoxHeight = 100
CheckboxesStartYPos := 630
FilePathEditBoxWidths := EditBoxWidths - MarginSpace - 70
FilePathEditBoxWidths := EditBoxWidths - MarginSize - 70
SelectFileButtonWidths := 30
ButtonStartYPos := CheckboxesStartYPos + 10
MarginSquared := MarginSpace * 2
MarginSquared := MarginSize * 2
if(DevMode){
MainButtonHeight := 30
@ -84,14 +91,18 @@ else, {
}
Return
; -------------------------------GUI-------------------------------
SetAndShowMainGUI:
Gosub, SetGUIVariables
Gui, Font, s%GuiFontSize%
Gui, Margin, %MarginSpace%, %MarginSpace%
Gui, Margin, %MarginSize%, %MarginSize%
; Video Title
Gui, Font, Bold
@ -101,56 +112,50 @@ Gui, Add, Text, x%PodcastNumberTextXPos% yp+0,Podcast #
Gui, Font, Normal
Gui, Add, Edit, y+5 x%MarginSpace% w%EditBoxHalfWidths% h%EditBoxHeight% gUpdateVars vVideoTitle, %VideoTitle%
Gui, Add, Edit, yp+0 x+%Marginspace% w%OdyseeURLSlugEditWidth% h%EditBoxHeight% gUpdateVars vLBRYURLSlug, %LBRYURLSlug%
Gui, Add, Edit, yp+0 x+%Marginspace% w%PodcastNumberEditWidth% h%EditBoxHeight% gUpdateVars vPodcastNumber, %PodcastNumber%
Gui, Add, Edit, y+5 x%MarginSize% w%EditBoxHalfWidths% h%EditBoxHeight% gUpdateVars vVideoTitle, %VideoTitle%
Gui, Add, Edit, yp+0 x+%MarginSize% w%OdyseeURLSlugEditWidth% h%EditBoxHeight% gUpdateVars vLBRYURLSlug, %LBRYURLSlug%
Gui, Add, Edit, yp+0 x+%MarginSize% w%PodcastNumberEditWidth% h%EditBoxHeight% gUpdateVars vPodcastNumber, %PodcastNumber%
; LBRY URL
Gui, Font, Bold
Gui, Add, Text, x%Marginspace%,Video Tags (Comma Seperated)
Gui, Add, Text, x%MarginSize%,Video Tags (Comma Seperated)
Gui, Add, Text,x%ColumnOneHalfWidthXPos% yp+0,Podcast Tags (Comma Seperated)
Gui, Font, Normal
Gui, Add, Edit, x%Marginspace% Y+5 w%EditBoxHalfWidths% h%EditBoxHeight% gUpdateVars vVideoTags, %VideoTags%
Gui, Add, Edit, yp+0 x+%Marginspace% w%EditBoxHalfWidths% h%EditBoxHeight% gUpdateVars vPodcastTags, %PodcastTags%
Gui, Add, Edit, x%MarginSize% Y+5 w%EditBoxHalfWidths% h%EditBoxHeight% gUpdateVars vVideoTags, %VideoTags%
Gui, Add, Edit, yp+0 x+%MarginSize% w%EditBoxHalfWidths% h%EditBoxHeight% gUpdateVars vPodcastTags, %PodcastTags%
; Video Description
; Description/Summary Headers
Gui, Font, Bold
Gui, Add, Text,y+%MarginSize% x%MarginSize%,Description
Gui, Add, Text,yp+0 x%ColumnOneHalfWidthXPos%,Summary
if(NoOriginalVideoDescription)
Gui, Add, Text,cRed y+%Marginspace% x%Marginspace%,Video Description
else,
Gui, Add, Text,y+%Marginspace% x%Marginspace%,Video Description:
if(TestingMode)
Gui, Add, Text,cRed yp+0 xp+150 ,TESTING MODE
Gui, Font, Normal
; Video Description edit box
Gui, Add, Edit,x%MarginSize% y+5 w%EditBoxHalfWidths% h%VideoDescriptionEditBoxHeight% vVideoDescription gSubmitDescription,%VideoDescription%
; Video Summary Edit Box
Gui, Add, Edit,x%ColumnOneHalfWidthXPos% yp+0 w%EditBoxHalfWidths% h%VideoDescriptionEditBoxHeight% vVideoSummary gUpdateVars,%VideoSummary%
if(DevMode)
Gui, Add, Text,cRed yp+0 xp+150 ,DEV MODE
Gui, Font, Normal
Gui, Add, Edit,x%Marginspace% y+2 w%EditBoxWidths% h%VideoDescriptionEditBoxHeight% vVideoDescription gSubmitDescription,%VideoDescription%
gui, font, s8
Gui, font, Bold
if(DescriptionCharCount > 3000){
Gui, Add, Edit,cRed w50 h20 x%DescriptionCharCountXPos% y+1 vDescriptionCharCount, %DescriptionCharCount%
}
else,
Gui, Add, Edit, w50 h20 x%DescriptionCharCountXPos% y+1 vDescriptionCharCount, %DescriptionCharCount%
Gui, Font, Normal
Gui, Add,Text, yp+3 xp-310, (Platform Char. Limits: DM+Bitchute = 3K, Odysee,Brighteon = 5K)
Gui, Add, Edit, x%MarginSize% y+5 vDescriptionCharCount, %DescriptionCharCount%
Gui, Add,Text, yp+4 x+%MarginSize%,Limits: DM+Bitchute = 3K, Odysee, Brighteon = 5K
; Gui, font, Bold
Gui, Font, s%GuiFontSize%
Gui, font, Bold
Gui, Add, GroupBox,r8.5 x%MarginSpace% yp+10 w%EditBoxWidths% Center, Filepaths
Gui, Add, GroupBox,r8.5 x%MarginSize% y+10 w%EditBoxWidths% Center, Filepaths
; Video Filepath
Gui, Font, Bold
Gui, Add, Text,xp+5 yp+15,Video Filepath
Gui, Font, Normal
Gui, Add, Edit, x%MarginSquared% y+2 w%FilePathEditBoxWidths% h%EditBoxHeight% gUpdateVars vVideoFilepath,%VideoFilepath%
Gui, Add, Button, x+5 yp+0 h%EditBoxHeight% gSelectVideoFilepath, Select
Gui, Add, Button, x+%MarginSize% yp+0 h%EditBoxHeight% gSelectVideoFilepath, Select
; Video Thumbnail Filepath
Gui, Font, Bold
@ -160,7 +165,7 @@ else,
Gui, Add, Text,y+15 x%MarginSquared% ,Video Thumbnail Filepath
Gui, Font, Normal
Gui, Add, Edit, x%MarginSquared% y+2 w%FilePathEditBoxWidths% h%EditBoxHeight% gUpdateVars vVideoThumbFilepath,%VideoThumbFilepath%
Gui, Add, Button, x+5 yp+0 h%EditBoxHeight% gSelectVideoThumbFilepath, Select
Gui, Add, Button, x+%MarginSize% yp+0 h%EditBoxHeight% gSelectVideoThumbFilepath, Select
; WAV Audio File Filepath
Gui, Font, Bold
if(WavAudioFilepath = "")
@ -173,7 +178,7 @@ else, { ; change text depending on if WAV or FLAC file
}
Gui, Font, Normal
Gui, Add, Edit, x%MarginSquared% y+2 w%FilePathEditBoxWidths% h%EditBoxHeight% gUpdateVars vWavAudioFilepath,%WavAudioFilepath%
Gui, Add, Button, x+5 yp+0 h%EditBoxHeight% gSelectWAVFilepath, Select
Gui, Add, Button, x+%MarginSize% yp+0 h%EditBoxHeight% gSelectWAVFilepath, Select
Gui, Font, Bold
if(MP3AudioFilepath = "")
@ -182,138 +187,114 @@ else,
Gui, Add, Text,x%MarginSquared% y+15,Podcast MP3 Filepath
Gui, Font, Normal
Gui, Add, Edit, x%MarginSquared% y+2 w%FilePathEditBoxWidths% h%EditBoxHeight% gUpdateVars vMP3AudioFilepath,%MP3AudioFilepath%
Gui, Add, Button, x+5 yp+0 h%EditBoxHeight% gSelectMP3Filepath, Select
Gui, Add, Button, x+%MarginSize% yp+0 h%EditBoxHeight% gSelectMP3Filepath, Select
; Submit Button
Gui, Font, s%GuiFontSize%
gui, Font, Bold
; if(DevMode)
; Gui, Add, Button, x%MarginSpace% w%EditBoxHalfWidths% y+25 h%MainButtonHeight% gCancelPost hwndIcon, Close
; else,
; Script Update Button
if(UpdateAvailable){
Gui, Add, Button, w%EditBoxHalfWidths% x%MarginSpace% gUpdateScript vUpdateAvailable h%SecondaryButtonHeights% center,Uploader Update Available!
; GuiButtonIcon(Icon, "shell32.dll", 278, "s20 a1 r2")
}
else, {
Gui, Add, Button, w%EditBoxHalfWidths% x%MarginSpace% gUpdateScript vUpdateAvailable h%SecondaryButtonHeights% center,Uploader Up-to-Date
; Gui, Add, Button, w%EditBoxHalfWidths% x+%Marginspace% vUpdateAvailable hwndIcon, Script is Up-to-Date
; GuiButtonIcon(Icon, "shell32.dll", 239, "s20 a1 r2")
}
; Gui, Font, s20
; Gui, Font, Bold
Gui, Add, Button, x+%MarginSpace% w%EditBoxHalfWidths% h%SecondaryButtonHeights% gStartScript, UPLOAD
Gui, Add, Button, w%EditBoxFourthWidths% x%MarginSize% vUpdateAvailable h%SecondaryButtonHeights% gUpdateScript,FVU Up-to-Date
Gui, Font, s%GuiFontSize%
Gui, Add, Button, x+%MarginSize% w%EditBoxFourthWidths% h%SecondaryButtonHeights% gOpenProjectFolder, Open Folder
; Chrome Update Button
if(ChromeUpdateAvailable){
Gui, Add, Button, x%MarginSpace% w%EditBoxHalfWidths% y+%Marginspace% h%SecondaryButtonHeights% vChromeUpdateAvailable gUpdateChrome center,Chrome Update Available!
}
else, {
Gui, Add, Button, x%MarginSpace% w%EditBoxHalfWidths% y+%Marginspace% h%SecondaryButtonHeights% vChromeUpdateAvailable gUpdateChrome center,Chrome Up-to-Date
Gui, Add, Button, x+%MarginSize% w%EditBoxHalfWidths% h%SecondaryButtonHeights% gScheduleUpload, Schedule for Later
}
; Gui, Add, Button, x%MarginSpace% w%EditBoxHalfWidths% y+25 h%MainButtonHeight% gCancelPost hwndIcon, Exit
; GuiButtonIcon(Icon, "imageres.dll",208, "s20 a1 r2")
Gui, Add, Button, w%EditBoxFourthWidths% h%SecondaryButtonHeights% x%MarginSize% y+%MarginSize% vChromeUpdateAvailable gUpdateChrome, Chrome Up-to-Date
Gui, Add, Button, x+%MarginSize% yp+0 w%EditBoxFourthWidths% h%SecondaryButtonHeights% gDisplayResults, View Status
Gui, Add, Button, x+%MarginSize% w%EditBoxHalfWidths% h%SecondaryButtonHeights% gStartScript, UPLOAD
Gui, Add, Button, w%EditBoxFourthWidths% h%SecondaryButtonHeights% x%MarginSize% y+%MarginSize% vPostSchedulerUpdateAvailable gUpdatePostScheduler, Post Scheduler Up-To-Date
; Gui, Add, Button, w%EditBoxFourthWidths% h%SecondaryButtonHeights% x%MarginSize% y+%MarginSize% vPostSchedulerUpdateAvailable, Post Scheduler Up-To-Date
if(DevMode)
Gui, Add, Button, x+%MarginSpace% yp+0 w%EditBoxFourthWidths% h%SecondaryButtonHeights% gDisplayResults, View Results
else,
Gui, Add, Button, x+%MarginSpace% yp+0 w%EditBoxFourthWidths% h%SecondaryButtonHeights% gDisplayResults, View Results
Gui, Add, Button, w%EditBoxFourthWidths% x+%Marginspace% h%SecondaryButtonHeights% gOpenProjectFolder, Open Project Folder
Gui, Add, Button, x+%MarginSize% w%EditBoxFourthWidths% h%SecondaryButtonHeights%
Gui, Add, Button, x+%MarginSize% w%EditBoxHalfWidths% h%SecondaryButtonHeights% gReloadScript, Open New Project
if(DevMode){
Gui, Add, Button, x%MarginSpace% w%EditBoxFourthWidths% h30 y+5 h%SecondaryButtonHeights% gOpenErrorLog, Open ErrorLog
Gui, Add, Button, x+%MarginSpace% w%EditBoxFourthWidths% h30 h%SecondaryButtonHeights% gClearVideoLinks, Clear VideoLinks
Gui, Add, Button, x%MarginSize% w%EditBoxFourthWidths% h30 y+5 h%SecondaryButtonHeights% gOpenErrorLog, Open ErrorLog
Gui, Add, Button, x+%MarginSize% w%EditBoxFourthWidths% h30 h%SecondaryButtonHeights% gClearVideoLinks, Clear VideoLinks
}
; -------------------------------Page 2 Side of Main GUI Window-------------------------------
LineSplitXPosition := PageTwoXStartPos - ( MarginSpace * 2)
gui, add, text, x%LineSplitXPosition% y20 h500 0x11 ; 0x11 is a "line" ; refer to here: https://autohotkey.com/board/topic/50910-draw-line-gui/
; Thumbnail Preview
Gui, Font, Normal
gui, Font, s4
LineSplitXPosition := PageTwoXStartPos - ( MarginSize * 2)
gui, add, text, x%LineSplitXPosition% y20 h600 0x11 ; 0x11 is a "line"
; Miscellaneous Settings
; DevMode Buttons
gui, Font, s4
Gui, Font, Normal
DevModToggleButton := PageTwoXStartPos + 160
Gui, Add, Button, x%DevModToggleButton% y5 w50 h10 gToggleDevMode,DevMode
Gui, Add, Button, x+5 y5 w50 h10 gToggleTestingMode, Testing Mode
Gui, Add, Button, x+5 y5 w50 h10 gOpenGiteaPage, Gitea
Gui, Add, Button, x+%MarginSize% y5 w50 h10 gToggleTestingMode, Testing Mode
Gui, Add, Button, x+%MarginSize% y5 w50 h10 gOpenGiteaPage, Gitea
Gui, Font, s%GuiFontSize%
Gui, Font, Bold
Gui, Font, Normal
; Settings Section
Gui, Add, GroupBox,r5 y+0 x%PageTwoXStartPos% w%PageTwoGroupBoxWidth%,Settings
Gui, Add, Checkbox, xp+10 yp+20 vAutoUpdateCheck gUpdateVars Checked%AutoUpdateCheckCheckStatus%, Auto Update Check
Gui, Add, Checkbox, vShowTooltipProgress Checked%ShowTooltipProgressCheckStatus% gUpdateVars,Show Tooltip Progress
Gui, Add, Checkbox, vKillLBRYAfterUpload Checked%KillLBRYAfterUploadCheckStatus%, Kill LBRY After Uploading
Gui, Add, Checkbox, vAutoLogin gUpdateVars Checked%AutoLoginCheckStatus%, Try to Login Automatically
Gui, Add, Checkbox, vPingOnCompletion gUpdateVars Checked%PingOnCompletionCheckStatus%, Discord Ping Upon Completion
Gui, Add, GroupBox,r6 y+0 x%PageTwoXStartPos% w%PageTwoGroupBoxWidth%,Settings
Gui, Add, Checkbox, xp+10 yp+20 vAutoUpdateCheck gUpdateVars Checked%AutoUpdateCheck%, Auto Update Check
Gui, Add, Checkbox, vShowTooltipProgress Checked%ShowTooltipProgress% gUpdateVars,Show Tooltip of Actions
Gui, Add, Checkbox, vKillLBRYAfterUpload Checked%KillLBRYAfterUpload%, Kill LBRY After Uploading
Gui, Add, Checkbox, vErrorLogToDiscord gUpdateVars Checked%ErrorLogToDiscord%, Error Log to Discord
Gui, Add, Checkbox, vDiscordPingOnCompletion gUpdateVars Checked%DiscordPingOnCompletion%, Discord Ping Upon Completion
Gui, Add, Checkbox, vConfirmBeforeSubmit checked%ConfirmBeforeSubmit%, Confirm Before Submit
GroupBoxCheckboxPos := PageTwoXStartPos + MarginSpace
GroupBoxCheckboxPos := PageTwoXStartPos + MarginSize
; -------------------------------PLATFORMS-------------------------------
Gui, Add, GroupBox,r6 y+%MarginSpaceTripled% x%PageTwoXStartPos% w%PageTwoGroupBoxWidth%, Platforms
; Msgbox % "LocalsURL: " LocalsURL
; if(VideoFileSizeInMB < 1792)
; Gui, Add, Checkbox, x+%MarginSpaceDoubled% vFacebook Checked%FacebookCheckStatus%, Facebook
Gui, Font, s%GuiFontSize%
Gui, Font, Bold
Gui, Add, GroupBox,r6 y+%MarginSizeTripled% x%PageTwoXStartPos% w%PageTwoGroupBoxWidth%, Platforms
Gui, Add, Checkbox, xp+10 yp+25 vBitChute Checked%BitChuteCheckStatus% gUpdateVars, BitChute
Gui, Font, s8
Gui, Font, Bold
Gui, Add, Button, xp+80 yp+0 gUncheckAllPlatforms, Uncheck All
Gui, Font, s%GuiFontSize%
Gui, Font, Normal
Gui, Add, Checkbox, x%GroupBoxCheckboxPos% yp+30 vBitChute Checked%BitChute% gUpdateVars, BitChute
if(LocalsURL = "LocalsUploadStartedNeedToGrabURL"){
; msgbox, checking grab url
Gui, Add, Checkbox, x+%MarginSpaceTripled% yp+0 vLocalsGrabURL Checked%LocalsCheckStatus% gUpdateVars, Locals (Grab URL)
Gui, Add, Checkbox, x+%MarginSizeTripled% yp+0 vLocalsGrabURL Checked%Locals% gUpdateVars, Locals (Grab URL)
LocalsGrabURL := 1
Locals := 0
}
else, {
; msgbox, checking locals
Gui, Add, Checkbox, x+%MarginSpaceTripled% yp+0 vLocals Checked%LocalsCheckStatus% gUpdateVars, Locals
Gui, Add, Checkbox, x+%MarginSizeTripled% yp+0 vLocals Checked%Locals% gUpdateVars, Locals
LocalsGrabURL := 0
Locals := 1
}
Gui, Add, Checkbox, x%GroupBoxCheckboxPos% y+%MarginSpace% vOdyseeVideo Checked%OdyseeVideoCheckStatus% gUpdateVars, Odysee Video
if(VideoFileSizeInMB < 50)
Gui, Add, Checkbox, vTelegram x+%MarginSpaceTripled% yp+0 Checked%TelegramCheckStatus% gUpdateVars, Telegram (>50 MB)
Gui, Add, Checkbox, x%GroupBoxCheckboxPos% y+%MarginSize% vOdyseeVideo Checked%OdyseeVideo% gUpdateVars, Odysee Video
Gui, Add, Checkbox, x%GroupBoxCheckboxPos% y+%MarginSize% vOdyseeAudio Checked%OdyseeAudio% gUpdateVars, Odysee Audio
; Gui, Add, Checkbox, x+%MarginSpace% vOdyseeVideoThumb Checked%OdyseeVideoThumbCheckStatus%,Thumbnail
Gui, Add, Checkbox, x%GroupBoxCheckboxPos% y+%MarginSpace% vOdyseeAudio Checked%OdyseeAudioCheckStatus% gUpdateVars, Odysee Audio
; Gui, Add, Checkbox, x+%MarginSpace% vOdyseeAudioThumb Checked%OdyseeAudioThumbCheckStatus%, Thumbnail
Gui, Add, Checkbox, x%GroupBoxCheckboxPos% y+%MarginSize% vRumble Checked%Rumble% gUpdateVars, Rumble
Gui, Add, Checkbox, x%GroupBoxCheckboxPos% y+%MarginSpace% vRumble Checked%RumbleCheckStatus% gUpdateVars, Rumble
if(VideoTotalBitrate > 300000)
Gui, Add, Checkbox, vBrighteon y+%MarginSpace% Checked%BrighteonCheckStatus% gUpdateVars, Brighteon
; Brighteon Does not accept videos lower than 300kbps or that don't have the appropriate aspect ratio
if(VideoTotalBitrate < 300000 OR !VideoHasBrighteonCompatibleAspectRatio){
if(!VideoHasBrighteonCompatibleAspectRatio)
Gui, Add, Checkbox, cRed vBrighteon y+%MarginSize% Checked0 gUpdateVars, Brighteon (Aspect Ratio is %VideoAspectRatio%)
else,
Gui, Add, Checkbox, cRed vBrighteon y+%MarginSize% Checked0 gUpdateVars, Brighteon (Bitrate Below 300kbps)
}
else,{
Gui, Add, Checkbox, cRed vBrighteon y+%MarginSpace% Checked0 gUpdateVars, Brighteon (Bitrate Below 300kbps)
Gui, Add, Checkbox, vBrighteon y+%MarginSize% Checked%Brighteon% gUpdateVars, Brighteon
}
Gui, Add, Checkbox, vDailyMotion y+%MarginSpace% Checked%DailyMotionCheckStatus% gUpdateVars, DailyMotion
; Gui, Add, Checkbox, vStreamanity Checked%StreamanityCheckStatus%, Streamanity
Gui, Add, Checkbox, vDailyMotion y+%MarginSize% Checked%DailyMotion% gUpdateVars, DailyMotion
; Gui, Font, s12
gui, Font, Bold
Gui, Add, GroupBox, r6.5 y+%MarginSpaceTripled% vImageThumbnail x%PageTwoXStartPos% w%PageTwoGroupBoxWidth%,Thumbnail
Gui, Font, s%GuiFontSize%
Gui, Font, Bold
Gui, Add, GroupBox, r6.5 y+%MarginSizeTripled% vImageThumbnail x%PageTwoXStartPos% w%PageTwoGroupBoxWidth%,Thumbnail
gui, Font, Normal
Gui, Add, Picture, xp+10 yp+20 w%ThumbnailPreviewWidth% h-1, %VideoThumbFilepath%
@ -334,4 +315,170 @@ Gui, Show,, %FullScriptName% - Upload Settings - %BodyTextFilePath%
ControlFocus, Edit4, %FullScriptName%
ToolTip
; calculate run time and convert to seconds
URunTime1 := round(((A_TickCount - UStartTime) / 1000), 2)
; - Check for Updates
;------------------------------------------------
if(AutoUpdateCheck AND !UpdateAvailable){
SetTimer, CheckForUpdates, -1000
}
; calculate run time and convert to seconds
URunTime2 := round(((A_TickCount - UStartTime) / 1000), 2)
Return
; Scheduler GUI
; ------------------------------------------------
ScheduleUpload:
gui, Submit, NoHide ; submit the main GUI so all the variables get updated
; Create GUI for Scheduler
Gui, ScheduleGUI:New
Gui, Font, s15
Gui, Font, Bold
Gui, Add, Text,, Date:
Gui, Add, DateTime,w%EditBoxHalfWidths% vScheduledDate , MM/dd/yyyy
Gui, Add, Text,, Time:
Gui, Add, DateTime, w%EditBoxHalfWidths% vScheduledTime Choose200505311900, Time
Gui, Add, Button,w%EditBoxHalfWidths% gSubmitScheduler, Schedule
Gui, Show,, Scheduler
Return
; Results GUI Screen
; ------------------------------------------------
SetAndShowResultsGUI:
; Set the GUI Variables, needed if called from Scheduler
Gosub, SetGUIVariables
Gui, Font, s%GuiFontSize%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% y+%MarginSize% h%ButtonHeights% w%CopyButtonWidths% gCopyToClipboard,Transcript URL
Gui, Font, Normal
Gui, Add, Edit, x+%MarginSize% yp+0 h%ButtonHeights% w%ResultEditBoxWidth% gUpdateVars vPodcastTranscriptURL, %PodcastTranscriptURL%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% y+%MarginSize% h%ButtonHeights% w%CopyButtonWidths% gCopyToClipboard, Bitchute
Gui, Font, Normal
Gui, Add, Edit, x+%MarginSize% yp+0 h%ButtonHeights% vBitChuteURL w%ResultEditBoxWidth% gUpdateVars , %BitChuteURL%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% y+%MarginSize% h%ButtonHeights% w%CopyButtonWidths% gCopyToClipboard, Brighteon
Gui, Font, Normal
Gui, Add, Edit, x+%MarginSize% yp+0 h%ButtonHeights% vBrighteonURL w%ResultEditBoxWidth% gUpdateVars , %BrighteonURL%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyToClipboard, DailyMotion
Gui, Font, Normal
Gui, Add, Edit, x+%MarginSize% yp+0 h%ButtonHeights% vDailyMotionURL w%ResultEditBoxWidth% gUpdateVars , %DailyMotionURL%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyToClipboard, Odysee Video
Gui, Font, Normal
Gui, Add, Edit, x+%MarginSize% yp+0 h%ButtonHeights% vOdyseeVideoURL w%ResultEditBoxWidth% gUpdateVars, %OdyseeVideoURL%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyToClipboard, Odysee Audio
Gui, Font, Normal
Gui, Add, Edit, x+%MarginSize% yp+0 h%ButtonHeights% vOdyseeAudioURL w%ResultEditBoxWidth% gUpdateVars , %OdyseeAudioURL%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyToClipboard, Rumble
Gui, Font, Normal
Gui, Add, Edit, x+%MarginSize% yp+0 h%ButtonHeights% vRumbleURL w%ResultEditBoxWidth% gUpdateVars , %RumbleURL%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyToClipboard, Locals
Gui, Font, Normal
Gui, Add, Edit, x+%MarginSize% yp+0 h%ButtonHeights% vLocalsURL w%ResultEditBoxWidth% gUpdateVars, %LocalsURL%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyToClipboard, Unauthorized
Gui, Font, Normal
Gui, Add, Edit, x+%MarginSize% yp+0 h%ButtonHeights% vUnauthorizedTVURL w%ResultEditBoxWidth% gUpdateVars, %UnauthorizedTVURL%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyToClipboard, Video Tags
Gui, Font, Normal
Gui, Add, Edit, x+%MarginSize% yp+0 h%ButtonHeights% vVideoTags w%ResultEditBoxWidth% gUpdateVars , %VideoTags%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyToClipboard, Podcast Tags
Gui, Font, Normal
Gui, Add, Edit, x+%MarginSize% yp+0 h%ButtonHeights% vPodcasttags w%ResultEditBoxWidth% gUpdateVars , %Podcasttags%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyToClipboard, Description
Gui, Font, Normal
Gui, Add, Edit, x+%MarginSize% yp+0 h%ButtonHeights% vVideoDescription w%ResultEditBoxWidth% gUpdateVars , %VideoDescription%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyToClipboard, Summary
Gui, Font, Normal
Gui, Font, Normal
Gui, Add, Edit, x+%MarginSize% yp+0 h%ButtonHeights% vVideoSummary w%ResultEditBoxWidth% gUpdateVars , %VideoSummary%
Gui, Font, s%GuiFontSize%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% w%ResultsEditAndCopyButtonWidth% h%SecondaryButtonHeights% gUpdateINI, Save Modified Links to Files
; Error Log Column
; ------------------------------------------------
Gui, Font, s%GuiFontSize%
Gui, Add, Button, x+%MarginSize% y%MarginSize% w%ErrorLogEditBoxWidth% h%ButtonHeights% y%MarginSize% gOpenErrorLog, Error Log (Click to Open Detailed Log)
Gui, Add, Edit,x%ErrorLogEditBoxXPos% h%ErrorLogEditBoxHeight% w%ErrorLogEditBoxWidth% y+10, %ErrorLogVar%
gui, font, Normal
gui, font, s7
Gui, Add, StatusBar,, Total Videos Uploaded: %TotalVideosUploaded% | Total Clicks Saved: %MouseClicksSaved%
Gui, +Resize +MaximizeBox
Gui, add, text, x%MarginSize% y+%MarginSize% w%ResultsGUIWidth% 0x10 ;Horizontal Line > Etched Gray
; Results GUI Action Buttons
; ------------------------------------------------
Gui, Font, s%GuiFontSize%
Gui, Font, Bold
Gui, Add, Button, x%MarginSize% yp+%MarginSize% w%ResultsScreenOneThirdsWidth% h%SecondaryButtonHeights% gOpenLBRYBlobFilesFolder, Open LBRY Blob Folder
Gui, Add, Button, x+%MarginSize% w%ResultsScreenOneThirdsWidth% h%SecondaryButtonHeights% gUploadPodcast vUploadPodcast, Upload Podcast
Gui, Add, Button, x+%MarginSize% w%ResultsScreenOneThirdsWidth% h%SecondaryButtonHeights% gRetryUpload, Try Failed Again
Gui, Add, Button, x%MarginSize% y+%MarginSize% w%ResultsScreenOneThirdsWidth% h%SecondaryButtonHeights% gPostToDiscordAndTelegram vPostToDiscordTelegramButton, Post to Discord/Telegram
; Gui, Add, Button, x+%MarginSize% w%ResultsScreenOneThirdsWidth% h%SecondaryButtonHeights% gPostToTelegram vPostToTelegramButton, Post to Telegram
Gui, Add, Button, x+%MarginSize% w%ResultsScreenOneThirdsWidth% h%SecondaryButtonHeights% gStartSocialMediaPoster, Start Social Media Poster
; Row 3
; Gui, Add, Button, x%ResultEditBoxXPos% y+%MarginSize% w%ResultsScreenOneThirdsWidth% h%ButtonHeights%,
; Gui, Add, Button, x+%MarginSize% w%ResultEditBoxHalfWidths% w%ButtonWidths% h%ButtonHeights% gCancelPost , Close
; Gui, Add, Button, x+%MarginSize% w%ResultEditBoxHalfWidths% gKillScript %ButtonWidths% , Close
; gui, Add, Text, y+10
OriginalVideoDescription := VideoDescription
OriginalPodcastTags := PodcastTags
if(XPosition and YPosition)
Gui, Show,x%XPosition% y%YPosition%,%FullScriptName% - Uploads Status
else,
Gui, Show,,%FullScriptName% - Uploads Results
Return

@ -1,94 +0,0 @@
Gui, Font, s%GuiFontSize%
Gui, Font, Bold
; Gui, Add, Text,x10 y+10, Podcast #:
Gui, Add, Button, x10 y+%Marginspace% h%ButtonHeights% w%CopyButtonWidths% gCopyPodcastNumber, Podcast #
Gui, Font, Normal
Gui, Add, Edit, x+5 yp+0 h%ButtonHeights% w%ResultEditBoxWidths% gUpdateVars vPodcastNumber, %PodcastNumber%
Gui, Font, Bold
Gui, Add, Button, x10 y+%Marginspace% h%ButtonHeights% w%CopyButtonWidths% gCopyBitChuteURL, Bitchute
Gui, Font, Normal
Gui, Add, Edit, x+5 yp+0 h%ButtonHeights% vBitChuteURL w%ResultEditBoxWidths% gUpdateVars , %BitChuteURL%
Gui, Font, Bold
Gui, Add, Button, x10 y+%Marginspace% h%ButtonHeights% w%CopyButtonWidths% gCopyBrighteonURL, Brighteon
Gui, Font, Normal
Gui, Add, Edit, x+5 yp+0 h%ButtonHeights% vBrighteonURL w%ResultEditBoxWidths% gUpdateVars , %BrighteonURL%
Gui, Font, Bold
Gui, Add, Button, x10 y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyDailyMotionURL, DailyMotion
Gui, Font, Normal
Gui, Add, Edit, x+5 yp+0 h%ButtonHeights% vDailyMotionURL w%ResultEditBoxWidths% gUpdateVars , %DailyMotionURL%
Gui, Font, Bold
Gui, Add, Button, x10 y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyOdyseeVideoURL, Odysee Video
Gui, Font, Normal
Gui, Add, Edit, x+5 yp+0 h%ButtonHeights% vOdyseeVideoURL w%ResultEditBoxWidths% gUpdateVars, %OdyseeVideoURL%
Gui, Font, Bold
Gui, Add, Button, x10 y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyOdyseeAudioURL, Odysee Audio
Gui, Font, Normal
Gui, Add, Edit, x+5 yp+0 h%ButtonHeights% vOdyseeAudioURL w%ResultEditBoxWidths% gUpdateVars , %OdyseeAudioURL%
Gui, Font, Bold
Gui, Add, Button, x10 y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyRumbleURL, Rumble
Gui, Font, Normal
Gui, Add, Edit, x+5 yp+0 h%ButtonHeights% vRumbleURL w%ResultEditBoxWidths% gUpdateVars , %RumbleURL%
Gui, Font, Bold
Gui, Add, Button, x10 y+10 h%ButtonHeights% w%CopyButtonWidths%, Locals
Gui, Font, Normal
Gui, Add, Edit, x+5 yp+0 h%ButtonHeights% vLocalsURL w%ResultEditBoxWidths% gUpdateVars, %LocalsURL%
Gui, Font, Bold
Gui, Add, Button, x10 y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyVideoTags vVideoTagsEdit, Video Tags
Gui, Font, Normal
Gui, Add, Edit, x+5 yp+0 h%ButtonHeights% vVideoTags w%ResultEditBoxWidths% gUpdateVars , %VideoTags%
Gui, Font, Bold
Gui, Add, Button, x10 y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyPodcastTags, Podcast Tags
Gui, Font, Normal
Gui, Add, Edit, x+5 yp+0 h%ButtonHeights% vPodcasttags w%ResultEditBoxWidths% gUpdateVars , %Podcasttags%
Gui, Font, Bold
Gui, Add, Button, x%Marginspace% y+10 h%ButtonHeights% w%CopyButtonWidths% gCopyVideoDescription, Description
Gui, Font, Normal
Gui, Add, Edit, x+5 yp+0 h50 vVideoDescription w%ResultEditBoxWidths% gUpdateVars , %VideoDescription%
Gui, Font, s%GuiFontSize%
Gui, Font, Bold
Gui, Add, Button, x%ResultEditBoxXPos% w%ResultEditBoxHalfWidths% gUpdateINI, Save Modified Links
Gui, Add, Button, x+%MarginSpace% w%ResultEditBoxHalfWidths% gUploadPodcast, Upload Podcast
Gui, Add, Button, x%ResultEditBoxXPos% y+%MarginSpace% w%ResultEditBoxThirdsWidths% gPostToDiscord vPostToDiscordButton, Post to Discord
Gui, Add, Button, x+5 w%ResultEditBoxThirdsWidths% gPostToTelegram vPostToTelegramButton, Post to Telegram
Gui, Add, Button, x+5 w%ResultEditBoxThirdsWidths% gStartSocialMediaPoster, Start Social Media Poster
Gui, Font, Bold
Gui, Add, Button, x%ResultEditBoxXPos% y+%MarginSpace% w%ResultEditBoxHalfWidths% gSendErrorLoggingThroughTelegram,
Gui, Add, Button, x+%MarginSpace% w%ResultEditBoxHalfWidths% gRetryUpload, Try Failed Again
Gui, Add, Button, x%ResultEditBoxXPos% w%ResultEditBoxHalfWidths% gOpenLBRYBlobFilesFolder %ButtonWidths% , Open LBRY Blob Files Folder
Gui, Add, Button, x+%MarginSpace% w%ResultEditBoxHalfWidths% gCancelPost %ButtonWidths% , Close
; Gui, Add, Button, x+%MarginSpace% w%ResultEditBoxHalfWidths% gKillScript %ButtonWidths% , Close
; gui, Add, Text, y+10
Gui, Font, s%GuiFontSize%
Gui, Add, Button, x%ErrorLogEditBoxXPos% w%ErrorLogEditBoxWidth% y%MarginSpace% h%ButtonHeights%, Error Log
Gui, Add, Edit,x%ErrorLogEditBoxXPos% h%ErrorLogEditBoxHeight% w%ErrorLogEditBoxWidth% y+10, %ErrorLogVar%
gui, font, Normal
gui, font, s7
Gui, Add, StatusBar,, Total Videos Uploaded: %TotalVideosUploaded% | Total Clicks Saved: %MouseClicksSaved%
Gui, +Resize +MaximizeBox
OriginalVideoDescription := VideoDescription
OriginalPodcastTags := PodcastTags
if(XPosition and YPosition)
Gui, Show,x%XPosition% y%YPosition%,%FullScriptName% - Upload Results
else,
Gui, Show,,%FullScriptName% - Upload Results

@ -21,31 +21,6 @@ CheckLBRYProcess() ; double check lbry process
SaveOrPostProgress(Message:="Starting Upload",PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
; If LBRY Killer not found, then download it
; @todo: Add LBRY kill download functionality from gitea
LBRYKillerPath := LibFolder . "\LBRY Process Killer.exe"
if(!FileExist(LBRYKillerPath)){
; Msgbox % "LBRYKillerPath: " LBRYKillerPath
; Msgbox % "LBRYProcessKillerURL: " LBRYProcessKillerURL
LBRYKillerPath = %A_ScriptDir%\Lib\LBRY Process Killer.exe
LBRYKillerUpdateURL = https://freedomain.dev/yuriy/video-uploader/raw/branch/main/Modules/LBRY-Process-Killer.exe
Message = LBRY Process Killer Not Found. Automatically Downloading.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
UrlDownloadToFile, %LBRYKillerUpdateURL%, %LBRYKillerPath%
if(ErrorLevel){
Message = Failed to download the the LBRY-Killer.exe from %LBRYKillerUpdateURL%
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
Return
}
}
TooltipThis("Uploading Video through API")
; Variables of items that need to be replaced before argument is passed to API
Apostrophe = '
@ -201,13 +176,6 @@ if(!InStr(UploadResult, "permanent_url")){ ; if no permanent_url is generated th
Return
}
if(KillLBRYAfterUpload){
try run, %LBRYKillerPath%
catch e {
Message = LBRYKiller not found. Unable to find File.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
}
}
; Transform the Upload Result json into the LBRY.tv link
; PermanentURL := GetPermanentLBRYURL(UploadResult) ; get permanentURL from the upload result json
@ -360,7 +328,40 @@ if(LBRYUploadType = "Audio"){
IniWrite, %OdyseeAudioURL%, %VideoLinksIniFile%, URLs, OdyseeAudioURL
}
if(!LBRYKillerStarted){
; If LBRY Killer not found, then download it
; @todo: Add LBRY kill download functionality from gitea
LBRYKillerPath := LibFolder . "\LBRY Process Killer.exe"
if(!FileExist(LBRYKillerPath)){
; Msgbox % "LBRYKillerPath: " LBRYKillerPath
; Msgbox % "LBRYProcessKillerURL: " LBRYProcessKillerURL
LBRYKillerPath = %A_ScriptDir%\Lib\LBRY Process Killer.exe
LBRYKillerUpdateURL = https://freedomain.dev/yuriy/video-uploader/raw/branch/main/Modules/LBRY-Process-Killer.exe
Message = LBRY Process Killer Not Found. Automatically Downloading.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
UrlDownloadToFile, %LBRYKillerUpdateURL%, %LBRYKillerPath%
if(ErrorLevel){
Message = Failed to download the the LBRY-Killer.exe from %LBRYKillerUpdateURL%
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
Return
}
}
if(KillLBRYAfterUpload){
try run, %LBRYKillerPath%
catch e {
Message = LBRYKiller not found. Unable to find File.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
}
LBRYKillerStarted := 1
}
}
; SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
; SaveDriverURL()
AddToTotalVideosUploadedCount()

@ -100,6 +100,14 @@ Loop, 5 {
sleep, 2000
}
; click the "Hide Links Preview" checkbox to hide previews of hyperlinks
if(InStr(VideoDescription, "https")){
Xpath = (//div[@class='hide-switcher-container'])[1]
Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=1,SleepLength:=100)
}
; SaveOrPostProgress(Message:="Waiting Video to finish uploading",PostType:="Tooltip,ErrorLoggingTextFile")
Message = Uploading Video File
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile")
@ -112,6 +120,19 @@ if(Status){
}
; make sure the "Notify Users" checkbox is selected
Xpath = (//input[contains(@name,'is_do_promo')])[1]
try, Status := driver.findelementbyxpath(Xpath).isSelected()
if(Status = 0){
Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=1,SleepLength:=1000)
try, Status := driver.findelementbyxpath(Xpath).isSelected()
if(Status = "0"){
Message = Failed to Check ON the Notify Users Checkbox
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
}
}
; check if the "Auto Submit Post" checkbox is checked, and if not check it
js = return document.querySelector("#autosubmit_enabled").checked;
try AutoSubmitstatus := driver.executeScript(js)
@ -288,9 +309,9 @@ Loop % VideoTitleArray.Length(){
; get longest word in video title to use for grabbing the share link from the raw page
RegExMatch(VideoTitle, "ms)\b\S+(?CFindLongestWordInString)\b(?R)", m)
LongestWordInVideoTitle := longestWord
Msgbox % "LongestWordInVideoTitle: " LongestWordInVideoTitle
; RegExMatch(VideoTitle, "ms)\b\S+(?CFindLongestWordInString)\b(?R)", m)
; LongestWordInVideoTitle := longestWord
; Msgbox % "LongestWordInVideoTitle: " LongestWordInVideoTitle
; MsgBox, Longest word: %longestWord%`, #%wordLength%
@ -299,9 +320,23 @@ Msgbox % "LongestWordInVideoTitle: " LongestWordInVideoTitle
; Grab Video Share Link From Page Source
; ------------------------------------------------
ShareLink := GrabLocalsPostURLUsingTitle(VideoTitle)
if(!InStr(ShareLink, "https")){
Message = Couldn't find Video Share link in the first 10 posts. Is the video possibly still uploading?
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
Return
}
; Msgbox % "ShareLink: " ShareLink
; Msgbox % "LocalsVideoURL: " LocalsVideoURL
; Iterate over the last couple of posts, find the post with the title that contains the Longest word from the uploaded video
; And grab the share URL for it
/*
Message = Looking for - %LongestWordInVideoTitle% - within first 7 posts in order to grab share URL
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
@ -358,6 +393,7 @@ loop, 7 {
ShareLink :=
}
*/
if(ShareLink = ""){
Message = Video was published succsessfully, but failed to grab Share Link.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")

@ -1,271 +0,0 @@
; -------------------------------Functions-------------------------------
OnMsgBoxConfirmChromiumOverwrite() {
DetectHiddenWindows, On
Process, Exist
If (WinExist("ahk_class #32770 ahk_pid " . ErrorLevel)) {
ControlSetText Button1, Cancel
ControlSetText Button2, Yes
}
}
; https://www.autohotkey.com/docs/v2/Functions.htm#Variadic
Join(sep, params*) {
For index, param in params
str .= param . sep
return SubStr(str, 1, -StrLen(sep))
}
CheckLBRYProcess(){
; Check if LBRY Process exists
Process, Exist,LBRY.exe
if(ErrorLevel = 0) ; if doesn't exist
{
Message = Not Running. Starting up LBRY.exe
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile")
LBRYExeFilepath = C:\Program Files\LBRY\LBRY.exe
if(!FileExist(LBRYExeFilepath)){
Message = Failed to Find LBRY.exe executable. LBRY not installed?
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
Return
}
Message = Checking LBRY daemon_settings.yml file for Odysee Wallet Servers
SaveOrPostProgress(Message:=Message,PostType:=",ErrorLoggingTextFile,DiscordErrorLogging")
FileRead, daemon_settingsFileContent, C:\Users\%A_UserName%\AppData\Local\lbry\lbrynet\daemon_settings.yml
if(!InStr(daemon_settingsFileContent, "a-hub1.odysee.com")){
Message = Odysee wallet server is not in daemon_settings.yml. Replacing File with required settings.
SaveOrPostProgress(Message:=Message,PostType:=",DiscordErrorLogging")
LBRYDaemonSettingsFP = C:\Users\%A_UserName%\AppData\Local\lbry\lbrynet\daemon_settings.yml
LBRYDaemonSettingsBackupFP = C:\Users\%A_UserName%\AppData\Local\lbry\lbrynet\daemon_settings_BU.yml
; Msgbox % "daemon_settingsText: " daemon_settingsText
FileMove, %LBRYDaemonSettingsFP%, %LBRYDaemonSettingsBackupFP%, 1 ; Dest [, Flag (1 = overwrite)]
UrlDownloadToFile, https://freedomain.dev/yuriy/video-uploader/raw/branch/main/Assets/daemon_settings.yml , %LBRYDaemonSettingsFP%
sleep, 1000
if(!FileExist(LBRYDaemonSettingsFP)){
Message = Failed to download the custom daemon_settings.yml file from git. Restoring Original File
SaveOrPostProgress(Message:=Message,PostType:=",ErrorLoggingTextFile,DiscordErrorLogging")
FileMove,%LBRYDaemonSettingsBackupFP%,%LBRYDaemonSettingsFP%, 1
}
}
try run, "%LBRYExeFilepath%"
Message = Waiting 1 Minute for LBRY to start up
SaveOrPostProgress(Message:=Message,PostType:="Tooltip")
Sleep, 60000 ; 1 minute
Process, Exist,LBRY.exe
if(ErrorLevel = 0) ; if doesn't exist
{
Message = Failed to Start LBRY.exe after 60 seconds of waiting
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
Return
}
WinMinimize, LBRY
}
Return
}
GetPermanentLBRYURL(UploadResult){
SingleQuotationmark = "
UploadResult := StrSplit(UploadResult, "`n") ; split results by new line
; Iterate through the array of the results
Loop % UploadResult.Length() {
PermanentURL := UploadResult[A_Index]
if(InStr(PermanentURL, "permanent_url"))
Break
}
; Starting Result: "permanent_url": "lbry://Test-Video-161-Numbered#c9ad9afe54c7178d6f870b59bbe129aef8efc3ff",
PermanentURL := StrSplit(PermanentURL, "lbry:")
PermanentURL := "lbry:" . PermanentURL[2]
PermanentURL := StrReplace(PermanentURL, ",", "")
PermanentURL := StrReplace(PermanentURL, SingleQuotationmark, "")
PermanentURL := StrReplace(PermanentURL, "`n", "")
PermanentURL := StrReplace(PermanentURL, "`r", "")
; End Result lbry://Test-Video-161-Numbered#c9ad9afe54c7178d6f870b59bbe129aef8efc3ff
Return PermanentURL
}
GetLBRYCanonicalURL(LBRYJSONObject){ ; input json string
; ResolveURL := StrSplit(LBRYResolveAPICommand, "lbry://")
; ResolveURL := "lbry://" . ResolveURL[2]
; StrReplace(Haystack, SearchText [, ReplaceText, OutputVarCount, Limit := -1])
LBRYPermanentURLJsonOBJ := StrReplace(LBRYJSONObject, LBRYPermanentURL, "LBRYPermanentURL")
; clipboard := LBRYPermanentURLJsonOBJ
; DevModeMsgBox(LBRYPermanentURLJsonOBJ)
try parsed := JSON.Load(LBRYPermanentURLJsonOBJ)
try LBRYCanonicalURL := parsed.LBRYPermanentURL.canonical_url
; DevModeMsgBox(LBRYCanonicalURL)
if(LBRYCanonicalURL = ""){
Return "" ; return blank
}
; otherwise return the LBRY url
LBRYCanonicalURL := StrReplace(LBRYCanonicalURL, "lbry://", "https://lbry.tv/")
Return LBRYCanonicalURL
}
LBRYCMDTextReplacement(LBRYURLSlug){
SingleQUote = "
LBRYURLSlug := StrReplace(LBRYURLSlug, " ", "_") ; replace all spaces with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, ":", "_") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, ",", "_") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, "?", "") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, "!", "") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, "`;", "_") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, "/", "_") ; replace all colons with dashes
; LBRYURLSlug := StrReplace(LBRYURLSlug, "?", "") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, "<", "_") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, ">", "_") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, SingleQUote, "") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, "'", "") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, "=", "") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, ";", "") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, ")", "") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, "(", "") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, "___", "_") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, "__", "_") ; replace all colons with dashes
LBRYURLSlug := StrReplace(LBRYURLSlug, "__", "_") ; replace all colons with dashes
Return LBRYURLSlug
}
GetLBRYAPIErrorFromString(UploadResult){
UploadResultArray := StrSplit(UploadResult, "message")
LBRYAPIError := UploadResultArray[2]
; LBRYAPIErrorStrLen := StrLen(LBRYAPIError)
; LBRYAPIErrorStrToTrim := LBRYAPIErrorStrLen - 3
; Msgbox % "LBRYAPIErrorStrToTrim: " LBRYAPIErrorStrToTrim
LBRYAPIError := SubStr(LBRYAPIError, 4)
LBRYAPIError := StrReplace(LBRYAPIError, "}", "")
; Msgbox % "LBRYAPIError: " LBRYAPIError
Return LBRYAPIError
}
LogErrorToTextFile(Error){
/* if(LogErrorsToTextFile != 1)
Return
*/
ErrorLoggingFile := VideoFolderDir . "\" . "ErrorLogging.txt"
FormatTime, TodayDate , YYYYMMDDHH24MISS, yyyyMMdd_hhmmss
text =
(
---------------%TodayDate%---------------
%CurrentSite%: %Error%
)
if(LogErrorsToMsgbox)
Msgbox % "Text: " Text
FileAppend, %Text%, %ErrorLoggingFile%
} ; End of Function
/*
*/
AddToTotalVideosUploadedCount(){
; IniRead, TotalVideosUploaded, %SettingsIniFilepath%, General, TotalVideosUploaded, %A_Space%
TotalVideosUploaded += 1
; IniWrite, %TotalVideosUploaded%, %SettingsIniFilepath%, General, TotalVideosUploaded
}
OnMsgBoxPodcastFinish() {
DetectHiddenWindows, On
Process, Exist
If (WinExist("ahk_class #32770 ahk_pid " . ErrorLevel)) {
WinMove,, 0
}
}
OnMsgBoxSocialMediaPoster() {
DetectHiddenWindows, On
Process, Exist
If (WinExist("ahk_class #32770 ahk_pid " . ErrorLevel)) {
ControlSetText Button1, Yes
ControlSetText Button2, Not Now
}
}
Check_For_Stuck_Video_Upload(Index_Number, Upload_Status){
if(A_index = 1){ ; Create a blank array
ProgressStatusArray := []
Return
}
Message = Upload Status: %Upload_Status%
SaveOrPostProgress(Message:=Message,PostType:="Tooltip")
; if we reached the last loop number:
if(A_index = %Number_of_loops_to_Check_Upload_status%){
Message = Upload Most Likely Failed: Video Hasn't Finished Uploading after 1 hour.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
SaveDriverURLOFErrorPage()
Return "Failed"
}
; If progress is still the same after a ten minute interval then error out
if(HasVal(Array_Index_Num_of_Upload_StatusChecks, A_index)){ ; if current index is in Array of index numbers to check status during
; Send a notification message of upload status
Message = Upload Status: %Upload_Status%
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
; if current upload_status is in the array of values that are updated every 10 mins
if(HasVal(ProgressStatusArray, Upload_Status)){
Message = Upload Failed (E#4508)`nUpload Stuck at same point for 10 minutes. Stuck Status: %ProgressStatus%
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
SaveDriverURLOFErrorPage()
Return "Failed"
}
ProgressStatusArray.Push(Upload_Status) ; append current status to array
}
} ; end of func
; Find the longest word in a string of words
FindLongestWordInString(m, calloutNumber, pos, haystack, pattern){
Global wordLength, longestWord
len := StrLen(m)
If ( len > wordLength )
{
wordLength := len
longestWord := m
; MsgBox, %m%
}
}

@ -216,6 +216,9 @@ Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength
Xpath = //input[@id='url-rumble']
Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=RumbleURL)
; Input Rumble URL
Xpath = //input[@id='url-unauthorizedtv']
Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=UnauthorizedTVURL)
; Soundcloud but actually LBRY Audio URL
Xpath = //input[@id='url-lbry-audio']
@ -244,12 +247,18 @@ SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile")
Xpath = //textarea[@id='description']
Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000)
; Input Description
; Format text JS
JSVideoDescription := FormatTextToJSText(VideoDescription)
JSVideoSummary := FormatTextToJSText(VideoSummary)
; Input Description
js = document.getElementById('description').value = "%JSVideoDescription%";
try driver.executeScript(js) ;Executes a Javascript on the webpage, mostly used for buttons.
try driver.executeScript(js)
if(VideoSummary){
js = document.getElementById('summary').value = "%JSVideoSummary%";
try driver.executeScript(js)
}
Message = Inputting Tags
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile")
@ -321,7 +330,10 @@ Sublime Indentation Reset
Message = Input Complete! `nPlease Confirm and click Final "Save" Button on Podcast Page
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile")
sleep, 5000
; Change GUI button from "Upload Podcast"
GuiControl,,UploadPodcast, Podcast Uploaded
; sleep, 5000
CurrentSite :=
ToolTip

@ -1,7 +1,15 @@
PostToDiscord:
;------------------------------------------------
CurrentSite := "Discord"
if(!FileExist(VideoThumbFilepath)){
Message = Post Aborted.`nVideo Thumbnail not found at:`n%VideoThumbFilepath%
SaveOrPostProgress(Message,PostType:="ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
MsgBox 0x10,, %Message%
Return
}
CurrentSocialMediaPosting := "Discord"
Message = Posting Video Links to Discord
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
@ -13,62 +21,82 @@ if(DiscordVideosWebhookURL = ""){
Msgbox, Unable to Grab DiscordVideosWebhookURL from %SettingsIniFilepath%.`nPlease input the URL and then try again.
Return
}
; https://stackoverflow.com/questions/63160401/how-to-create-hyperlink-in-discord-in-an-embed-in-general
/*
; If description is longer than 2k chars, then API will error out. goto section that will allow user to edit video description to shorten it for posting
if(StrLen(SocialMediaDescription) > 2000 AND VideoDescriptionForVideosChannel = ""){
Goto, CreateDescriptionForVideosPosting
}
*/
if(SocialMediaDescription = ""){
CreateDescriptionForSocialMedia()
}
; Msgbox % "SocialMediaDescription: " SocialMediaDescription
; clear out variables in case the button is clicked twice
VideoLinks :=
Message :=
DiscordVideoDescription :=
SubmitDescriptionForDiscordVideosChannel:
Message := "**" . VideoTitle . "**" . "`n" . SocialMediaDescription . "`n"
; https://stackoverflow.com/questions/63160401/how-to-create-hyperlink-in-discord-in-an-embed-in-general
; Do this with an array!!
;
TooltipMessage = Checking Bitchute and Brighteon URL for Processing Status
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
if(BitChuteURL != "")
Message .= "[BitChute](<" . BitChuteURL . ">) \| "
; check the status of the Bitchute URL to see if it's done processing
; shows "404 - Page not found" on page if not
if(BitChuteURL){
if(!InStr(URLDownloadToVar(BitChuteURL), "404 - Page not found")){
if(BitChuteURL != "")
VideoLinks .= "[BitChute](<" . BitChuteURL . ">) \| "
}
else, {
LogMessage = Bitchute URL skipped, URL Currently leads to: 404 - page not found
SaveOrPostProgress(Message:=LogMessage,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
}
}
if(BrighteonURL != "")
Message .= "[Brighteon](<" . BrighteonURL . ">) \| "
if(OdyseeVideoURL != "")
Message .= "[Odysee](<" . OdyseeVideoURL . ">) \| "
; check the status of the Brighteon URL to see if it's done processing
; shows "404 - Page not found" on page if not
if(BrighteonURL){
if(!InStr(URLDownloadToVar(BrighteonURL), "SELECTED IS NOT CURRENTLY AVAILABLE")){
if(BrighteonURL != "")
VideoLinks .= "[Brighteon](<" . BrighteonURL . ">) \| "
}
else, {
ErrorLogMsg = Brighteon URL skipped, URL Currently leads to: 404 - page not found
SaveOrPostProgress(Message:=ErrorLogMsg,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
}
}
if(OdyseeAudioURL != "")
Message .= "[Odysee (Audio)](<" . OdyseeAudioURL . ">) \| "
/*
if(OdyseeVideoURL != "")
Message .= "[Odysee](<" . OdyseeVideoURL . ") \| "
VideoLinks .= "[Odysee](<" . OdyseeVideoURL . ">) \| "
if(OdyseeAudioURL != "")
Message .= "[Odysee Audio](<" . OdyseeAudioURL . ") \| "
VideoLinks .= "[Odysee (Audio)](<" . OdyseeAudioURL . ">) \| "
*/
if(RumbleURL != "")
Message .= "[Rumble](<" . RumbleURL . ">) \| "
/*if(StreamanityURL != "" AND InStr(StreamanityURL, "streamanity.com"))
Message .= "[Streamanity](<" . StreamanityURL . ">) \| "
VideoLinks .= "[Rumble](<" . RumbleURL . ">) \| "
*/
if(DailyMotionURL != "")
Message .= "[DailyMotion](<" . DailyMotionURL . ">)"
VideoLinks .= "[DailyMotion](<" . DailyMotionURL . ">) \| "
if(PodcastTranscriptURL != "")
VideoLinks .= "[Video Transcript](<" . PodcastTranscriptURL . ">) \| "
if(PodcastNumber != "")
VideoLinks .= "[FDRPodcasts](<" . "https://fdrpodcasts.com/" . PodcastNumber . ">) \| "
; trim the video description if Title + Body + Links is longer than 2000 chars
if((StrLen(VideoTitle) + StrLen(VideoDescription) + StrLen(VideoLinks)) > 2000){
DiscordAPICharsLeft := 2000 - StrLen(VideoTitle) - StrLen(VideoLinks) - 15
DiscordVideoDescription := SubStr(VideoDescription, 1, DiscordAPICharsLeft) . "..."
}
else,
DiscordVideoDescription := VideoDescription
Message = VideoLinks variable contents:
UploadImageToDiscord(DiscordVideosWebhookURL, Message, VideoThumbFilepath)
Message := "**" . VideoTitle . "**" . "`n" . DiscordVideoDescription . "`n`n" . VideoLinks
Status := UploadImageToDiscord(DiscordVideosWebhookURL, Message, VideoThumbFilepath)
Message = API Response:`n%Status%
SaveOrPostProgress(Message:=Message,PostType:="ErrorLoggingTextFile")
SaveOrPostProgress(Message:="Video Links posted to #Videos Successfully.",PostType:="Tooltip,ErrorLoggingTextFile")
GuiControl,, PostToDiscordButton, Discord - Posted Successfully
GuiControl,, PostToDiscordTelegramButton, Discord - Posted Successfully
sleep, 2000
ToolTip

@ -1,6 +1,14 @@
PostToTelegram:
;------------------------------------------------
CurrentSocialMediaPosting := "Telegram"
CurrentSite := "Telegram"
if(!FileExist(VideoThumbFilepath)){
Message = Post Aborted.`nVideo Thumbnail not found at:`n%VideoThumbFilepath%
SaveOrPostProgress(Message,PostType:="ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
MsgBox 0x10,, %Message%
Return
}
Message = Posting Video Links to Telegram
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
@ -15,154 +23,153 @@ if(TelegramBotToken = "" Or TelegramBotChatID =""){
Message = TelegramBotToken or TelegramBotChatID is missing from %SettingsIniFilepath%. `nPlease input them and click the button again.
msgbox, 4096, Error!, %Message%
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
; Msgbox, 4096, Error!, TelegramBotToken or TelegramBotChatID is missing from %SettingsIniFilepath%. `nPlease input them and rerun the script.
Return
}
/*
; If description is longer than 2k chars, then API will error out. goto section that will allow user to edit video description to shorten it for posting
if(StrLen(SocialMediaDescription) > 2000 AND VideoDescriptionForVideosChannel = ""){
goto, CreateDescriptionForVideosPosting
}
*/
/*
if(SocialMediaDescription = ""){
CreateDescriptionForSocialMedia()
}
if(SocialMediaDescription > 1000){ ; Telegram has a 1024 char media caption capacity
SocialMediaDescription := SubStr(SocialMediaDescription, 1, 500)
}
*/
; @todo: split telegram message into multiple posts
SubmitDescriptionForTelegramVideosChannel:
TelegramVideoTitle := ASCIISTRReplace(VideoTitle)
TelegramVideoTitle := "*" . TelegramVideoTitle . "*"
TelegramBodymessage := ASCIISTRReplace(VideoDescription)
; Variables
LineBreakChar = `%0A ; Used for API
VideoLinks :=
if(BitChuteURL != "")
VideoLinks .= "[BitChute](" . BitChuteURL . ") \| "
if(BrighteonURL != "")
VideoLinks .= "[Brighteon](" . BrighteonURL . ") \| "
; Create the Hyperlinks for each Platform
; ------------------------------------------------
; check the status of the Bitchute URL to see if it's done processing
; shows "404 - Page not found" on page if not
if(BitChuteURL){
if(!InStr(URLDownloadToVar(BitChuteURL), "404 - Page not found")){
if(BitChuteURL != "")
VideoLinks .= "[BitChute](" . BitChuteURL . ") \| "
}
else, {
LogMessage = Bitchute URL skipped, URL Currently leads to: 404 - page not found
SaveOrPostProgress(Message:=LogMessage,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
}
}
if(OdyseeVideoURL != "")
VideoLinks .= "[Odysee](" . OdyseeVideoURL . ") \| "
; check the status of the Brighteon URL to see if it's done processing
; shows "404 - Page not found" on page if not
if(BrighteonURL){
if(!InStr(URLDownloadToVar(BrighteonURL), "SELECTED IS NOT CURRENTLY AVAILABLE")){
if(BrighteonURL != "")
VideoLinks .= "[Brighteon](" . BrighteonURL . ") \| "
}
else, {
LogMessage = Brighteon URL skipped, URL Currently leads to: 404 - page not found
SaveOrPostProgress(Message:=LogMessage,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
}
}
if(OdyseeAudioURL != "")
VideoLinks .= "[Odysee \(Audio\)](" . OdyseeAudioURL . ") \| "
/*
if(OdyseeVideoURL != "")
VideoLinks .= "[Odysee](" . OdyseeVideoURL . ") \| "
if(OdyseeAudioURL != "")
VideoLinks .= "[Odysee Audio](" . OdyseeAudioURL . ") \| "
VideoLinks .= "[Odysee \(Audio\)](" . OdyseeAudioURL . ") \| "
*/
if(RumbleURL != "")
VideoLinks .= "[Rumble](" . RumbleURL . ") \| "
/*
if(InStr(StreamanityURL, "https://streamanity.com/video/"))
VideoLinks .= "[Streamanity](" . StreamanityURL . ") \| "
*/
if(DailyMotionURL != "")
VideoLinks .= "[DailyMotion](" . DailyMotionURL . ") \| "
if(PodcastNumber != "")
VideoLinks .= "[FDRPodcasts](" . "https://fdrpodcasts.com/" . PodcastNumber . ") \| "
TelegramMessage := TelegramVideoTitle . "`n" . TelegramBodymessage . "`n" . VideoLinks
TelegramMessage := TelegramVideoTitle . "`n" . TelegramBodymessage . "`n" . VideoLinks
StrLenOfMessageAndVideoLinks := StrLen(TelegramVideoTitle) + StrLen(TelegramBodymessage) + StrLen(VideoLinks)
; DevModeMsgBox(StrLenOfMessageAndVideoLinks)
if(StrLenOfMessageAndVideoLinks > 1024){
; Telegram SendMessage is limited to 4096 characters
if(StrLenOfMessageAndVideoLinks < 4096){ ; split into sendphoto and 1 sendmessage
; DevModeMsgBox("Less than 4096 chars")
; Photo and Video Title go into SendPhoto
TelegramVideoTitle := TelegramVideoTitle . "`n" . VideoLinks
Status := SendTelegramPhoto(TelegramBotToken, TelegramBotChatID, VideoThumbFilepath, caption := TelegramVideoTitle ) ; you could add more options; compare the Telegram API docs
; Video Description goes into TelegramMessage
Status2 := SendTelegramMessage(TelegramBotToken, TelegramBotChatID, text := TelegramBodymessage)
; If Length of Title, Video Links and Message is less than 1024 characters:
; ------------------------------------------------
if(StrLenOfMessageAndVideoLinks < 1024) {
Message = Sending Post as One Message
SaveOrPostProgress(Message,PostType:="Tooltip,ErrorLoggingTextFile")
} ; split into 2 SendMessages
else if (StrLenOfMessageAndVideoLinks > 4096 AND StrLenOfMessageAndVideoLinks < 8192){ ; Split into 2 parts
TelegramVideoTitle := TelegramVideoTitle . "`n" . VideoLinks
Status := SendTelegramPhoto(TelegramBotToken, TelegramBotChatID, VideoThumbFilepath, caption := TelegramVideoTitle ) ; you could add more options; compare the Telegram API docs
Status := SendTelegramPhoto(TelegramBotToken, TelegramBotChatID, VideoThumbFilepath, caption := TelegramMessage ) ; you could add more options; compare the Telegram API docs
if(InStr(Status, "error_code")){
Message = Telegram Post Failed Due To An Api Issue. Please See Errorlog For More Info.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
}
Message = API Response:`n%Status% ; Output returned data to ErrorLog File
SaveOrPostProgress(Message:=Message,PostType:=",ErrorLoggingTextFile")
}
TelegramBodymessagePiece := SubStr(TelegramBodymessage, 1, 4096)
Status2 := SendTelegramMessage(TelegramBotToken, TelegramBotChatID, text := TelegramBodymessagePiece)
TelegramBodymessagePiece := SubStr(TelegramBodymessage, 4097, 8192)
Status3 := SendTelegramMessage(TelegramBotToken, TelegramBotChatID, text := TelegramBodymessagePiece)
; If Title, Links and Message are longer than 1024, but less than 4096, split into 2 pieces: sendphoto and sendmessage
; ------------------------------------------------
if(StrLenOfMessageAndVideoLinks < 4096){
Message = Sending Post as Two Messages
SaveOrPostProgress(Message,PostType:="Tooltip,ErrorLoggingTextFile")
} ; split into 3 sendMessages
else if (StrLenOfMessageAndVideoLinks > 8192 AND StrLenOfMessageAndVideoLinks < 12288){ ; Split into 3 parts
; Photo and Video Title go into SendPhoto
TelegramVideoTitle := TelegramVideoTitle . "`n" . VideoLinks
Status := SendTelegramPhoto(TelegramBotToken, TelegramBotChatID, VideoThumbFilepath, caption := TelegramVideoTitle ) ; you could add more options; compare the Telegram API docs
TelegramBodymessagePiece := SubStr(TelegramBodymessage, 1, 4096)
msgbox % StrLen(TelegramBodymessagePiece)
Status2 := SendTelegramMessage(TelegramBotToken, TelegramBotChatID, text := TelegramBodymessagePiece)
TelegramBodymessagePiece := SubStr(TelegramBodymessage, 4097, 8192)
msgbox % StrLen(TelegramBodymessagePiece)
DevModeMsgBox(TelegramBodymessagePiece)
Status3 := SendTelegramMessage(TelegramBotToken, TelegramBotChatID, text := TelegramBodymessagePiece)
; TelegramBodymessagePiece := SubStr(TelegramBodymessage, 8193, 12288)
; Status3 := SendTelegramMessage(TelegramBotToken, TelegramBotChatID, text := TelegramBodymessagePiece)
if(InStr(Status, "error_code")){
Message = Telegram Post Failed Due To An Api Issue. Please See Errorlog For More Info.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
}
Message = API Response:`n%Status% ; Output returned data to ErrorLog File
SaveOrPostProgress(Message:=Message,PostType:=",ErrorLoggingTextFile")
} else, { ; if less than 1024 characters, send normally
Status := SendTelegramPhoto(TelegramBotToken, TelegramBotChatID, VideoThumbFilepath, caption := TelegramMessage ) ; you could add more options; compare the Telegram API docs
; Video Description goes into TelegramMessage
Status := SendTelegramMessage(TelegramBotToken, TelegramBotChatID, text := TelegramBodymessage)
if(InStr(Status, "error_code")){
Message = Telegram Post Failed due to an API Issue. Error was saved to ErrorLogging file. Please send it to Yuriy.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
; SaveOrPostProgress(Message:=Status,PostType:=",ErrorLoggingTextFile")
Message = Telegram Error: %Status%
Message = Telegram Post Failed Due To An Api Issue. Please See Errorlog For More Info.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
ToolTip
Return
}
}
; Msgbox % "SizeOfCaption: " SizeOfCaption
; SizeOfCaption := SizeOfCaption +
; Message .= VideoLinks
; msgbox % StrLen(VideoLinks)
Message = API Response:`n%Status% ; Output returned data to ErrorLog File
SaveOrPostProgress(Message:=Message,PostType:=",ErrorLoggingTextFile")
; Message := StrReplace(Message, "`n", LineBreakChar) ; replace all new line characters with the global charater
}
else, {
; If Title, links and message are longer than 4096 chars, we need to split them into multiple messages
; ------------------------------------------------
Message = Sending Post as Multiple Messages
SaveOrPostProgress(Message,PostType:="Tooltip,ErrorLoggingTextFile")
; msgbox % StrLen(Message)
TelegramVideoTitle := TelegramVideoTitle . "`n" . VideoLinks
Status := SendTelegramPhoto(TelegramBotToken, TelegramBotChatID, VideoThumbFilepath, caption := TelegramVideoTitle ) ; you could add more options; compare the Telegram API docs
if(InStr(Status, "error_code")){
Message = Telegram Post Failed Due To An Api Issue. Please See Errorlog For More Info.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
}
Message = API Response:`n%Status% ; Output returned data to ErrorLog File
SaveOrPostProgress(Message:=Message,PostType:=",ErrorLoggingTextFile")
; Split the Description into 4096 character chunks while preserving sentences
; Used 4095 because a ". " has to be put in at the end of the chunk.
VideoDescriptionChunks := SplitStringWithSentences(TelegramBodymessage, 4094)
; SaveOrPostProgress(Message:=Message,PostType:="ErrorLoggingTextFile,DiscordVideos")
; SaveOrPostProgress(Message:="Video Links posted to #Videos Successfully.",PostType:="Tooltip,ErrorLoggingTextFile")
Message = Video Links Posted to Telegram Successfully
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile")
GuiControl,, PostToTelegramButton, Telegram - Posted Successfully
; go through array and post each chunk as new message
Loop % VideoDescriptionChunks.Length(){
; ArrayItem := ARRAY[A_Index]
Description := VideoDescriptionChunks[A_Index]
; sleep, 2000
Status := SendTelegramMessage(TelegramBotToken, TelegramBotChatID, text := Description)
if(InStr(Status, "error_code")){
Message = Telegram Post Failed Due To An Api Issue. Please See Errorlog For More Info.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
}
Message = API Response:`n%Status% ; Output returned data to ErrorLog File
SaveOrPostProgress(Message:=Message,PostType:=",ErrorLoggingTextFile")
}
}
Message = Video Links Posted to Telegram Successfully
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile")
GuiControl,, PostToDiscordTelegramButton, Telegram - Posted Successfully
ToolTip
CurrentSite :=
Return
; -------------------------------/Telegram-------------------------------
ToolTip
CurrentSite :=
Return
; -------------------------------/Telegram-------------------------------

@ -24,7 +24,7 @@ try CurrentURL := driver.URL
if(InStr(CurrentURL, "/login.php")){
if(AutoLogin){
Message = Logging in Automatically by clicking into the UN+PW fields for info to register
Message = Trying to Log in Automatically by clicking into the UN+PW fields for info to register from Password Manager
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile")
; have to click into username and password field for page to register that there's input
@ -39,11 +39,12 @@ if(InStr(CurrentURL, "/login.php")){
js = document.querySelector("button[type='submit']").click();
driver.executeScript(js)
; Do a double check to make sure that login worked
Message = Checking Login Status
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
sleep, 5000
try CurrentURL := driver.URL
if(!InStr(CurrentURL, "/upload")){
@ -67,11 +68,10 @@ if(InStr(CurrentURL, "/login.php")){
sleep, 5000
}
; CheckForAlerts()
Message = Uploading Video File
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
; SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile")
Xpath = //input[@id='Filedata']
Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=VideoFilepath)
@ -84,6 +84,9 @@ if(Status){
}
Message = Inputting Video Information
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
; Input Title
try driver.findElementsByName("title").item[1].SendKeys(VideoTitle) ;selects element based on Name and sends variable to it.
catch e {
@ -117,63 +120,36 @@ Loop, 5 { ; Attempt to input video description a couple of times
*/
}
; Input Primary Category
Xpath = (//input[@placeholder='- Primary category -'])[1]
try, driver.FindElementByXPath(Xpath).SendKeys("Podcasts").SendKeys(driver.Keys.ENTER)
; sleep, 5000
/*
; Skip the channel selection for now
; Rumble now has a "Set this channel as default" checkbox
Message = Selecting Channel
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile")
; Get list of channels and select the second one in the list
; First is the user profile
; Second is the Normal Channel
Xpath = (//fieldset[@id='channelId'])[1]
Try Channels := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text
UploadChannelName := StrSplit(Channels, "`n")[2]
; try driver.findElementsByID("channelId").item[1].click()
; @todo replace with regex
js = return document.querySelector("#channelId").innerHTML;
try, ChannelIDNumber := driver.executeScript(js)
; Msgbox % "ChannelIDNumber: " ChannelIDNumber
ChannelIDNumber := StrSplit(ChannelIDNumber, "option value=")
; Msgbox % "ChannelIDNumber: " ChannelIDNumber
ChannelIDNumber := ChannelIDNumber[3]
; Msgbox % "ChannelIDNumber: " ChannelIDNumber
SingleQuote = "
ChannelIDNumber := StrSplit(ChannelIDNumber, "data-private")
ChannelIDNumber := ChannelIDNumber[1]
ChannelIDNumber := StrReplace(ChannelIDNumber, SingleQuote, "")
ChannelIDNumber := StrReplace(ChannelIDNumber, " ", "")
; Msgbox % "ChannelIDNumber: " ChannelIDNumber
; js = return document.querySelector("#channelId").value;
; try, ChannelIDNumber := driver.executeScript(js)
; Msgbox % "ChannelIDNumber: " ChannelIDNumber
if(ChannelIDNumber = ""){
Message = ChannelIDNumber is blank. Unable to select Upload Channel
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
SaveDriverURLOFErrorPage()
if(!UploadChannelName){
Message = Failed to Grab Upload Channel Name
SaveOrPostProgress(Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
Return
}
; //option[@value='762377'] ; freedomain
Xpath = //option[@value='%ChannelIDNumber%']
try driver.FindElementByXPath(Xpath).click()
catch e {
Message = Failed to click on Channel using %ChannelIDNumber%.
SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
SaveDriverURLOFErrorPage()
Return
; SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging")
; SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging")
}
Xpath = (//label[normalize-space()='%UploadChannelName%'])[1]
Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000)
*/
; Input Tags
Message = Inputting Tags

@ -1,16 +1,28 @@
# Freedomain-Video-Uploader
Video Uploader written for the [Freedomain Philosophy Show](https://freedomain.com/)
![Alt text](Assets/Screenshots/Screenshot_Main_Results.png "Screenshot of Main and Results Window")
## Features
Automated posting to the following media platform using either the Platform's API or Selenium Chrome automation.
|**Locals**|**Bitchute**|**Rumble**|**DailyMotion**|**Brighteon**|**Odysee**
|--|--|--|--|--|--|
|Selenium|Selenium|Selenium|Selenium|Selenium|LBRY API
# Automated Video and Podcast Uploading to Multiple Sites using Autohotkey, Selenium, and Platform APIs
![Alt text](Assets/Screenshots/MainScreen_v341.png "Screenshot of Main and Results Window")
# Supported Platforms
| Platform | Upload Type |
|--|--|
| Locals | Video Upload w/Selenium |
| Bitchute | Video Upload w/Selenium |
| Rumble | Video Upload w/Selenium |
| DailyMotion | Video Upload w/Selenium |
| Brighteon | Video Upload w/Selenium |
| Odysee | Video + Audio Upload w/LBRY API |
| FDRPodcasts | Podcast w/Selenium |
| Discord | Announcement w/API |
| Telegram | Announcement w/API |
## Other Features
- Install Uploader Updates from Gitea automatically
- Install Chrome Updates from chromium.org automatically
- Schedule Posts for a later date & time
- Log Errors to a Discord Channel using webhook
- Discord Ping on Upload Completion
- Setting to confirm an upload before it's published
- Setting to show Tooltip progress at top of the screen showing current action being executed
# Installation
1. Install .Net Framework 3.5
@ -28,14 +40,11 @@ Automated posting to the following media platform using either the Platform's AP
- When run, the Uploader will automatically create the folders and files it requires in the same directory it's run from.
# Using Portable Version of Chrome
Using a portable version of Chrome will give you full control over chrome and chromedriver updates.
Using Selenium with a portable `Chrome for Testing` version of Chrome is the preferred way of uploading as it gives you full control over chrome and chromedriver updates and when to install them.
- When running the uploader for the first time, you will be notified that `Chrome for Testing` was not found and that you can download it by clicking the `Chrome Up to Date` button. This will automatically get the latest version of Chrome and download + extract it to the the `\lib\` folder. It will also download the appropriate `chromedriver.exe` file for that version and prompt you for admin permission to move it to `C:\Program Files\SeleniumBasic\chromedriver.exe`.
The Uploader will check for a portable version of Chrome first, before defaulting to the system installation
1. To use a portable version of Chrome, download the latest version Chrome version that has a chromedriver from [Chrome-for-Testing](https://googlechromelabs.github.io/chrome-for-testing/latest-versions-per-milestone-with-downloads.json), extract the `chrome-win64.zip` file and move the extracted folder to the `\Lib\` directory:
The resulting chrome filepath should be `..\Freedomain-Video-Uploader-Folder\Lib\chrome-win64\chrome.exe`
2. Download the `win64` chromedriver for the same version and move it to `C:\Program Files\SeleniumBasic\chromedriver.exe`
# Windows Defender False Positive
Windows Defender will sometimes flag the compiled .exe version as a false positive. The easiest way to get around this is to whitelist the directory the folder where you're keeping the Uploader files in. To do this, open up `Windows Powershell` as Administrator and run the following command: `Add-MpPreference -ExclusionPath "PATHTOTHEFOLDER"`, eg: `Add-MpPreference -ExclusionPath "C:\Users\yuriy\Downloads\VideoUploader"`
# Settings File
The Uploader reads & saves its settings to a `settings.ini` file, All customization, including custom profile URLs are stored here.
@ -71,6 +80,15 @@ You can select a different file in the main window if the auto selection does no
`*.jpg` or `*.png` file which will be the thumbnail for your video/podcast<br>
# LBRY Desktop Application `daemon_settings.yml`
Due to the LBRY Video Platform being discontinued, the default daemon_settings that come with the LBRY Desktop application might no longer work for you due to the servers being offline.
To fix this, add the Odysee server to the top of the list of `lbryum_servers` in the following file: `C:\Users\YOURUSERNAMEHERE\AppData\Local\lbry\lbrynet\daemon_settings.yml` [Source](https://www.reddit.com/r/lbry/comments/11zwtmj/is_lbry_down/)
```
lbryum_servers:
- a-hub1.odysee.com:50001
- spv11.lbry.com:50001
- spv19.lbry.com:50001
```
# Uncaught Errors
@ -83,7 +101,13 @@ I have done my best to catch any possible errors that might pop up and write fun
2. `git clone` the project and then either run the `Compile Uploader to EXE.ahk` autohotkey script to automatically compile, or start up the AHK compiler that comes installed with Autohotkey and select the `Freedomain Video Uploader.ahk` and `\Assets\FreedomainVideo.ico` icon.
# Extra Tools
# Helper Tools
The following tools will be automatically downloaded from Gitea as needed in order to do the following actions.
## LBRY-Process-Killer
Program that continuously reads the lbrynet.log for when your videos are fully uploaded/seeded to lbry and then kills the LBRY process. This can be be disabled using the `Kill LBRY after Uploading` checkbox on the main screen
## Post Scheduler
Program that continually checks the `Scheduled Posts` folder and automatically starts the Uploader with the specific video/post at the specified scheduled time.
Autohotkey script that continuously reads the lbrynet.log for when your videos are fully uploaded/seeded to lbry and then kills the LBRY process.
##

@ -1,3 +1,3 @@
[Video-Uploader]
Version=3.31
Version=3.53
Name=Freedomain Video Uploader
Loading…
Cancel
Save