Recording SHOUTcast

Share your advanced PureBasic knowledge/code with the community.
User avatar
oryaaaaa
Enthusiast
Enthusiast
Posts: 791
Joined: Mon Jan 12, 2004 11:40 pm
Location: Okazaki, JAPAN

Recording SHOUTcast

Post by oryaaaaa »

Simple tips

Code: Select all

If InitNetwork()=0
  MessageRequester("Not support TCP network", "Sorry, This software need TCP network", #MB_OK|#MB_ICONERROR|#MB_SYSTEMMODAL)
EndIf

Procedure.b SHOUTcastToSave(Host.s, Port.l, filename.s, agent.s, count.l)
  Protected CRLF.s = Chr(13)+Chr(10)
  Protected counter.l = 0
  Protected *RecieveBuf = AllocateMemory(131072)
  Protected ConnectionID = OpenNetworkConnection(Host, Port, #PB_Network_TCP)
  Protected RequestData.s = "GET / HTTP/1.0"+CRLF+"Host: " + Host
  RequestData +CRLF+ "User-agent: "+agent +CRLF+"Accept: */*"+CRLF+CRLF
  If ConnectionID
    SendNetworkString(ConnectionID, RequestData)
    Repeat
      Protected NetEvent = NetworkClientEvent(ConnectionID)
      If NetEvent<>0
        If NetEvent=#PB_NetworkEvent_Data And counter=0
          Protected RecieveBufsize.l = ReceiveNetworkData(ConnectionID, *RecieveBuf, 131072)
          Protected RecieveHeaderEnd.l = FindString(PeekS(*RecieveBuf,#PB_Ascii),CRLF+CRLF,0)
          If RecieveHeaderEnd=0
            RecieveHeaderEnd = RecieveBufsize
          EndIf
          Protected RecieveHeader.s = PeekS(*RecieveBuf)
          If FindString(RecieveHeader, "ICY 200 OK",0)=0
            CloseNetworkConnection(ConnectionID)
            FreeMemory(*RecieveBuf)
            ProcedureReturn #False ; Station no answer
          EndIf
          Protected file.l = CreateFile(#PB_Any, filename)
          counter +1
          If RecieveBufsize>(RecieveHeaderEnd+4)
            WriteData(file, *RecieveBuf+RecieveHeaderEnd+4, RecieveBufsize-RecieveHeaderEnd-4)
          EndIf
        ElseIf NetEvent=#PB_NetworkEvent_Data
          RecieveBufsize = ReceiveNetworkData(ConnectionID, *RecieveBuf, 131072)
          WriteData(file, *RecieveBuf, RecieveBufsize)
          counter +1
        EndIf 
      EndIf
      
      If counter=count
        CloseFile(file)
        CloseNetworkConnection(ConnectionID)
        FreeMemory(*RecieveBuf)
        ProcedureReturn #True ; Finish recoding
      EndIf
      Delay(1)
    ForEver
  EndIf 
  ProcedureReturn #False
EndProcedure

If SHOUTcastToSave("205.234.179.5", 80, "test.mp3", "PureHeart", 200)
  MessageRequester("Finish", "Record to test.mp3", #MB_OK|#MB_ICONINFORMATION)
Else
  MessageRequester("Error", "Have network trouble", #MB_OK|#MB_ICONERROR)
EndIf

End
cas
Enthusiast
Enthusiast
Posts: 597
Joined: Mon Nov 03, 2008 9:56 pm

Post by cas »

Thanks for sharing this code.
Post Reply