Page 1 of 1

JustBeamIt

Posted: Sun Nov 12, 2023 6:13 pm
by infratec
Since it was a request for a multiform upload to JustBeamIt, I had to test it.
As result I wrote a complete module :mrgreen:

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
Save it as JustBeamIt_Upload.pb:

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
Save it as JustBeamIt_Download.pb:

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
Beam me up Scotty :!:

Re: JustBeamIt

Posted: Sun Nov 12, 2023 7:03 pm
by Caronte3D
infratec wrote: Sun Nov 12, 2023 6:13 pm Beam me up Scotty :!:
:lol: :lol:
Thanks for the module, Infratec :wink:

Re: JustBeamIt

Posted: Sun Nov 12, 2023 7:27 pm
by idle
Two to beam up Scotty!

Re: JustBeamIt

Posted: Sun Nov 12, 2023 7:30 pm
by Quin
Haha, this is why I love these forums! :)

Thanks for all your work, Infratec!

Re: JustBeamIt

Posted: Mon Nov 13, 2023 8:02 am
by infratec
- Changed the parameter for Download(), to make things easier
- Added EnableExplicit
- Added some MessageRequesters to the Download program

Re: JustBeamIt

Posted: Sun Dec 03, 2023 9:42 pm
by Kwai chang caine
More simple site... :shock: except "Blank_" page...i never see :mrgreen:
Thanks for sharing the code and link, can be usefull 8)

Re: JustBeamIt

Posted: Wed Dec 27, 2023 8:33 pm
by minimy
Really helpful, thanks for sharing.
I didn't know that place

Re: JustBeamIt

Posted: Thu Dec 28, 2023 8:07 am
by Denis
infratec,

Each zip file created (download) is impossible to open, and WinRar (6.11 64 bit) indicates that the archive is damaged or its format is unknown.
I've tried with different files but it's always the same.
:cry: :cry:

When I use JustBeamIt.com directly without your module, it works and the file to download is not in zip format.

Re: JustBeamIt

Posted: Thu Dec 28, 2023 10:16 am
by infratec
I just uploaded a zip file, downloaded it and unzipped it with Total Commander: no problem.

What exactly are you doing? (Step by step please) ?

Re: JustBeamIt

Posted: Thu Dec 28, 2023 10:20 am
by infratec
Ah ...

You upload an exe file for example, but get a zip file back.
If you loock inside the zip file you will notice that it is an exe file.
You can rename it,
I will check it.

Normally I only upoad zip files, and the dowwnload is Ok than.

Re: JustBeamIt

Posted: Thu Dec 28, 2023 10:31 am
by infratec
I modified the module above.