As result I wrote a complete module

Save it as JustBeamIt.pbi:
Code: Select all
; https://www.purebasic.fr/english/viewtopic.php?t=82854
;
; https://justbeamit.com
;
; https://github.com/justbeamit/beam/blob/master/beam
; https://github.com/cartertemm/pybeamit/blob/master/pybeamit/__init__.py
;
; 2023.12.28 added correct filename in dowload procedure.
DeclareModule JustBeamIt
Declare.s pingForActiveBackend()
Declare.s getToken(Url$, List FilenameList$())
Declare.s Wait(Url$, Token$)
Declare.s Upload(Url$, Token$, List FilenameList$())
Declare.s Download(Url$, Token$, Dir$="")
EndDeclareModule
Module JustBeamIt
EnableExplicit
#JustBeamIt_URL$ = "www.justbeamit.com"
Structure ServerRoot_Structure
serverRoot.s
EndStructure
Structure FileInfo_Structure
fileName.s
fileSize.i
fileExtensionType.s
EndStructure
Structure Token_Structure
token.s
trackingId.s
transferToken.s
List fileIdentifiers.i()
EndStructure
Structure Upload_Structure
errorReason.s
transferState.s
connectionStatus.s
downloadName.s
validToken.i
EndStructure
Procedure.s pingForActiveBackend()
Protected HTTPRequest.i, JSON$, JSON.i, ServerRoot.ServerRoot_Structure
Debug "JustBeamIt_pingForActiveBackend()"
HTTPRequest = HTTPRequest(#PB_HTTP_Get, "http://" + #JustBeamIt_URL$ + "/ping?server_root=1")
If HTTPRequest
If HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode) = "200"
JSON$ = HTTPInfo(HTTPRequest, #PB_HTTP_Response)
JSON = ParseJSON(#PB_Any, JSON$)
If JSON
ExtractJSONStructure(JSONValue(JSON), @ServerRoot, ServerRoot_Structure)
FreeJSON(JSON)
EndIf
Else
Debug HTTPInfo(HTTPRequest, #PB_HTTP_Response)
EndIf
FinishHTTP(HTTPRequest)
EndIf
ProcedureReturn ServerRoot\serverRoot
EndProcedure
Procedure.s getToken(Url$, List FilenameList$())
Protected Response$, HTTPRequest.i, JSON.i, JSON$, Post$, Token.Token_Structure
Protected NewList FileInfo.FileInfo_Structure()
Protected NewMap HeaderMap$()
Debug "JustBeamIt_getToken()"
ForEach FilenameList$()
AddElement(FileInfo())
FileInfo()\fileName = GetFilePart(FilenameList$())
FileInfo()\fileSize = FileSize(FilenameList$())
FileInfo()\fileExtensionType = GetExtensionPart(FilenameList$())
Next
JSON = CreateJSON(#PB_Any)
If JSON
InsertJSONList(JSONValue(JSON), FileInfo())
JSON$ = ComposeJSON(JSON)
FreeJSON(JSON)
Post$ = "files=" + URLEncoder(JSON$) + ~"&type=CLI"
Debug Post$
HeaderMap$("Content-Type") = "application/x-www-form-urlencoded"
HTTPRequest = HTTPRequest(#PB_HTTP_Post, Url$ + "/token", Post$, 0, HeaderMap$())
If HTTPRequest
If HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode) = "200"
JSON$ = HTTPInfo(HTTPRequest, #PB_HTTP_Response)
JSON = ParseJSON(#PB_Any, JSON$)
If JSON
ExtractJSONStructure(JSONValue(JSON), @Token, Token_Structure)
FreeJSON(JSON)
EndIf
Else
Debug HTTPInfo(HTTPRequest, #PB_HTTP_Response)
EndIf
FinishHTTP(HTTPRequest)
EndIf
EndIf
ProcedureReturn Token\transferToken
EndProcedure
Procedure.s Wait(Url$, Token$)
Protected Response$, HTTPRequest.i
Debug "JustBeamIt_Wait()"
HTTPRequest = HTTPRequest(#PB_HTTP_Get, Url$ + "/wait?token=" + Token$ + ~"&type=CLI")
If HTTPRequest
If HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode) = "200"
Response$ = HTTPInfo(HTTPRequest, #PB_HTTP_Response)
Debug Response$
Else
Debug HTTPInfo(HTTPRequest, #PB_HTTP_Response)
EndIf
FinishHTTP(HTTPRequest)
EndIf
ProcedureReturn Response$
EndProcedure
Procedure.s Upload(Url$, Token$, List FilenameList$())
Protected.i HTTPRequest, Index, JSON, PostLen, BoundaryLen, File, FileLen
Protected Boundary$, Post$, JSON$
Protected *Buffer
Protected Upload.Upload_Structure
Protected NewMap HeaderMap$()
Debug "JustBeamIt_Upload()"
Boundary$ = "JustBeamIt boundary " + FormatDate("%yyyy%mm%dd%hh%ii%ss", Date())
HeaderMap$("Content-Type") = "multipart/form-data; boundary=" + Boundary$
ForEach FilenameList$()
File = ReadFile(#PB_Any, FilenameList$())
If File
FileLen = Lof(File)
Post$ = "--" + Boundary$ + #CRLF$
Post$ + "Content-Disposition: form-data; name=" + #DQUOTE$ + Str(Index) + #DQUOTE$ + "; filename=" + GetFilePart(FilenameList$()) + #CRLF$
Post$ + "Content-Type: application/octet-stream" + #CRLF$
Post$ + #CRLF$
PostLen = StringByteLength(Post$, #PB_UTF8)
BoundaryLen = StringByteLength(Boundary$, #PB_UTF8)
*Buffer = AllocateMemory(PostLen + FileLen + 2 + 2 + BoundaryLen + 2 + 2, #PB_Memory_NoClear)
If *Buffer
PokeS(*Buffer, Post$, -1, #PB_UTF8|#PB_String_NoZero)
If ReadData(File, *Buffer + PostLen, FileLen) = FileLen
PokeS(*Buffer + PostLen + FileLen, #CRLF$ + "--" + Boundary$ + "--" + #CRLF$, -1, #PB_UTF8|#PB_String_NoZero)
HeaderMap$("Content-Length") = Str(MemorySize(*Buffer))
HTTPRequest = HTTPRequestMemory(#PB_HTTP_Post, Url$ + "/upload?type=CLI&token=" + Token$ + "&index=" + Str(Index), *Buffer, MemorySize(*Buffer), 0, HeaderMap$())
If HTTPRequest
JSON$ = HTTPInfo(HTTPRequest, #PB_HTTP_Response)
;Debug JSON$
JSON = ParseJSON(#PB_Any, JSON$)
If JSON
ExtractJSONStructure(JSONValue(JSON), @Upload, Upload_Structure)
FreeJSON(JSON)
EndIf
FinishHTTP(HTTPRequest)
EndIf
EndIf
FreeMemory(*Buffer)
EndIf
CloseFile(File)
EndIf
Index + 1
Next
ProcedureReturn Upload\errorReason
EndProcedure
Procedure.s Download(Url$, Token$, Dir$="")
Protected HTTPRequest.i, *Buffer, File.i, Filename$, Ok.i, Headers$, Pos.i
Debug "JustBeamIt_Download()"
HTTPRequest = HTTPRequest(#PB_HTTP_Get, Url$ + "/download?token=" + Token$)
If HTTPRequest
If HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode) = "200"
*Buffer = HTTPMemory(HTTPRequest)
If *Buffer
Headers$ = HTTPInfo(HTTPRequest, #PB_HTTP_Headers)
Pos = FindString(Headers$, "filename=")
If Pos
Pos + 10
Filename$ = Mid(Headers$, Pos, FindString(Headers$, #DQUOTE$, Pos) - Pos)
Else
Filename$ = "jbi-" + Token$
EndIf
If Dir$ <> ""
If Right(Dir$, 1) <> #PS$
Dir$ + #PS$
EndIf
EndIf
Filename$ = Dir$ + Filename$
File = CreateFile(#PB_Any, Filename$)
If File
If WriteData(File, *Buffer, MemorySize(*Buffer)) = MemorySize(*Buffer)
Ok = #True
EndIf
CloseFile(File)
If Not Ok
DeleteFile(Filename$)
Filename$ = ""
EndIf
EndIf
FreeMemory(*Buffer)
EndIf
Else
Debug HTTPInfo(HTTPRequest, #PB_HTTP_Response)
EndIf
FinishHTTP(HTTPRequest)
EndIf
ProcedureReturn Filename$
EndProcedure
EndModule
Code: Select all
EnableExplicit
IncludeFile "JustBeamIt.pbi"
Define JustBeamIt_Url$, Filename$, JustBeamIt_transferToken$
NewList FilenameList$()
Filename$ = OpenFileRequester("Choose one or more files for upload", "", "All|*.*", 0, #PB_Requester_MultiSelection)
While Filename$
Debug Filename$
AddElement(FilenameList$())
FilenameList$() = Filename$
Filename$ = NextSelectedFileName()
Wend
If ListSize(FilenameList$())
JustBeamIt_Url$ = JustBeamIt::pingForActiveBackend()
Debug JustBeamIt_Url$
If JustBeamIt_Url$ <> ""
JustBeamIt_transferToken$ = JustBeamIt::getToken(JustBeamIt_Url$, FilenameList$())
If JustBeamIt_transferToken$ <> ""
If MessageRequester("JustBeamIt Uploader", "Copy the download url into clipboard?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
SetClipboardText(JustBeamIt_Url$ + "/download?token=" + JustBeamIt_transferToken$)
JustBeamIt::Wait(JustBeamIt_Url$, JustBeamIt_transferToken$)
Debug "Wait finished"
If JustBeamIt::Upload(JustBeamIt_Url$, JustBeamIt_transferToken$, FilenameList$()) = "NONE"
Debug "Upload Ok"
EndIf
EndIf
EndIf
EndIf
EndIf
Code: Select all
EnableExplicit
IncludeFile "JustBeamIt.pbi"
Define JustBeamIt_DownloadLink$, Url$, Token$, TargetDir$, Filename$
If MessageRequester("JustBeamIt Downloader", "Get download link from clipboard", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
JustBeamIt_DownloadLink$ = GetClipboardText()
Debug JustBeamIt_DownloadLink$
If Left(JustBeamIt_DownloadLink$, 4) = "http"
TargetDir$ = PathRequester("Choose a directory to store the file", "")
Filename$ = JustBeamIt::Download(JustBeamIt_DownloadLink$, TargetDir$)
If Filename$ <> ""
MessageRequester("Info", "Saved file as:" + #LF$ + #LF$ + Filename$)
Else
MessageRequester("Error", "Something failed")
EndIf
EndIf
EndIf
