JustBeamIt

Share your advanced PureBasic knowledge/code with the community.
infratec
Always Here
Always Here
Posts: 7618
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

JustBeamIt

Post 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 :!:
Last edited by infratec on Thu Dec 28, 2023 10:31 am, edited 5 times in total.
User avatar
Caronte3D
Addict
Addict
Posts: 1361
Joined: Fri Jan 22, 2016 5:33 pm
Location: Some Universe

Re: JustBeamIt

Post by Caronte3D »

infratec wrote: Sun Nov 12, 2023 6:13 pm Beam me up Scotty :!:
:lol: :lol:
Thanks for the module, Infratec :wink:
User avatar
idle
Always Here
Always Here
Posts: 5899
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: JustBeamIt

Post by idle »

Two to beam up Scotty!
Quin
Addict
Addict
Posts: 1133
Joined: Thu Mar 31, 2022 7:03 pm
Location: Colorado, United States
Contact:

Re: JustBeamIt

Post by Quin »

Haha, this is why I love these forums! :)

Thanks for all your work, Infratec!
infratec
Always Here
Always Here
Posts: 7618
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: JustBeamIt

Post by infratec »

- Changed the parameter for Download(), to make things easier
- Added EnableExplicit
- Added some MessageRequesters to the Download program
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: JustBeamIt

Post 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)
ImageThe happiness is a road...
Not a destination
User avatar
minimy
Enthusiast
Enthusiast
Posts: 619
Joined: Mon Jul 08, 2013 8:43 pm
Location: off world

Re: JustBeamIt

Post by minimy »

Really helpful, thanks for sharing.
I didn't know that place
If translation=Error: reply="Sorry, Im Spanish": Endif
Denis
Enthusiast
Enthusiast
Posts: 778
Joined: Fri Apr 25, 2003 5:10 pm
Location: Doubs - France

Re: JustBeamIt

Post 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.
A+
Denis
infratec
Always Here
Always Here
Posts: 7618
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: JustBeamIt

Post 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) ?
infratec
Always Here
Always Here
Posts: 7618
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: JustBeamIt

Post 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.
infratec
Always Here
Always Here
Posts: 7618
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: JustBeamIt

Post by infratec »

I modified the module above.
Post Reply