Titel von AudioCDs von FreeDB.org holen & DiscID berechnen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Ich kling mich mal in diesen thread ein, da ich auch für mein
eigenes Projekt diese möglichkeiten ausloten wollte.
(abfrage der freedb datenbank, sowie späteres automatisches laden von
Bildern der Covers aus dem Inet, dazu sind interpret und album wichtig.)

hier mein bisheriger code:

Code: Alles auswählen

Structure Struc_CD_Info
 DiscId.s
 Author.s
 Album.s
 Genre.s
 Year.s
 title.s[31]
EndStructure 
Global CD.Struc_CD_Info

Structure CON_THREAD
   CID.l
   *IP
   Port.l
EndStructure

If InitNetwork() = 0
   MessageRequester("Error", "No Network valid Stack found", 0)
   End
EndIf

Procedure OpenNetworkConnectionThread(*COM.CON_THREAD)
   Protected ConnectionID.l

   ConnectionID = OpenNetworkConnection(PeekS(*COM\IP), *COM\Port)
   If ConnectionID = 0
      *COM\CID = -1
   Else
      *COM\CID = ConnectionID
   EndIf

EndProcedure

Procedure.s IsEntry(Entry.s,Zeile.s)
 Entry +"="
 If Left(UCase(Zeile),Len(Entry))=UCase(Entry) 
  ProcedureReturn Right(Zeile,Len(Zeile)-Len(Entry))
 EndIf
 
EndProcedure
Procedure ScanFreeDBResult(Content.s)
 Repeat 
  Zeile.s = StringField(Content.s, i, Chr(10))
  i+1
  
  Entry.s="discid":If IsEntry(entry,Zeile.s)<>"":cd\discid + IsEntry(entry,Zeile):EndIf
  
  Entry.s="dtitle":
  If IsEntry(entry,Zeile.s)<>""
   
   cd\Author + IsEntry(entry,Zeile)
   p=FindString(cd\Author,"/",1)
   If p
    cd\album=Right(cd\Author ,Len(cd\Author)-p) 
    cd\Author =Left(cd\Author ,p-1)
   EndIf 
  EndIf
  
  Entry.s="dgenre":If IsEntry(entry,Zeile.s)<>"":cd\genre + IsEntry(entry,Zeile):EndIf
  Entry.s="dyear":If IsEntry(entry,Zeile.s)<>"":cd\Year + IsEntry(entry,Zeile):EndIf
  
  For T=1 To 30
   Entry.s="ttitle"+Str(T):If IsEntry(entry,Zeile.s)<>"":cd\title[t]+ IsEntry(entry,Zeile):EndIf
  Next

Until Zeile.s=""
EndProcedure

Procedure Main()
   Protected ConVar.CON_THREAD, Connected.l, HttpHeader.s, *Buffer, Received.s, Recv.l
   Protected Referer.s, UserAgent.s

   OpenWindow(0, 0, 0, 450, 340, "Test", #PB_Window_SystemMenu)
   CreateGadgetList(WindowID(0))
   ;StringGadget(0, 5, 5, 350, 20, "/~cddb/cddb.cgi?cmd=cddb+lscat+&hello=test+localhost+Purebasic+4.10&proto=5")
   StringGadget(0, 5, 5, 350, 20, "/~cddb/cddb.cgi?cmd=cddb+Read+rock+9f0e010c&hello=test+localhost+Purebasic+4.10&proto=5")
   ButtonGadget(1, 360, 5, 80, 20, "Send")
   EditorGadget(2, 5, 35, 435, 300, #PB_Editor_ReadOnly)

   HttpHeader = "GET {HTTPGETCOMMAND} HTTP/1.0" + #CRLF$
   HttpHeader + "Referer: " + Referer           + #CRLF$
   HttpHeader + "User-Agent: " + UserAgent      + #CRLF$
   HttpHeader + #CRLF$ + #CRLF$

   ConVar\IP   = @"freedb.freedb.org"
   ConVar\Port = 80
   *Buffer     = AllocateMemory(8192)

   Repeat
      Select WaitWindowEvent(10)
         Case #PB_Event_CloseWindow
            Break
         Case #PB_Event_Gadget
            Select EventGadget()
               Case 0
                  If EventType() = #PB_EventType_Change
                     If GetGadgetText(0)
                        DisableGadget(1, 0)
                     Else
                        DisableGadget(1, 1)
                     EndIf
                  EndIf
               Case 1
                  ConVar\CID = 0
                  Connected  = 0
                  CreateThread(@OpenNetworkConnectionThread(), @ConVar)
                  ClearGadgetItemList(2)
                  DisableGadget(0, 1)
                  DisableGadget(1, 1)
            EndSelect
      EndSelect
      If Connected = 0 And ConVar\CID <> 0
         Connected = 1
         If ConVar\CID <> -1
            SendNetworkString(ConVar\CID, ReplaceString(HttpHeader, "{HTTPGETCOMMAND}", GetGadgetText(0)))
         Else
            AddGadgetItem(2, -1, "Unable to reach Host")
            DisableGadget(0, 0)
            DisableGadget(1, 0)
         EndIf
      EndIf
      If ConVar\CID < -1 Or ConVar\CID > 0
         Select NetworkClientEvent(ConVar\CID)
            Case #PB_NetworkEvent_Data
               Recv = ReceiveNetworkData(ConVar\CID, *Buffer, 8192)
               If Recv > 0
                  Received + PeekS(*Buffer, Recv)
                  If Right(Received, 3) = "." + #CR$ + #LF$
                     AddGadgetItem(2, -1, Received)
                  
                     ScanFreeDBResult(Received)
                    Debug "CD-ID="+ cd\discid 
                    Debug "Interpret="+cd\Author
                    Debug "Album="+cd\Album
                    Debug "Genre="+cd\genre 
                    Debug "Year="+cd\Year
                    For T=1 To 30
                     If cd\title[t]<>""
                      Debug "Track-"+Str(T)+"=" + cd\title[t]
                     EndIf
                    Next 
                     
                     Received = ""
                     DisableGadget(0, 0)
                     DisableGadget(1, 0)
                     CloseNetworkConnection(ConVar\CID)
                     ConVar\CID = 0
                  EndIf
               EndIf
         EndSelect
      EndIf

   ForEver

   If ConVar\CID < -1 Or ConVar\CID > 0
      CloseNetworkConnection(ConVar\CID)
   EndIf
   FreeMemory(*Buffer)

EndProcedure

Main() 
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Noch a weng nachgebessert:
-Thread wird vor dem Ende der Prozedur gekillt, falls er noch rennt (hier auf Arbeit z.B. dauert das 10 Sek. bis er merkt, dass er ohne Proxy nicht rauskommt).
-WaitWindowEvent() nur im Bedarfsfall mit Timeout bestückt.
An Rings'ss' (<- extra für vtut sämtliche Kombinationen) Code hab ich nix geändert.

Code: Alles auswählen

Structure Struc_CD_Info
	DiscId.s
	Author.s
	Album.s
	Genre.s
	Year.s
	title.s[31]
EndStructure
Global CD.Struc_CD_Info

Structure CON_THREAD
	CID.l
	*IP
	Port.l
	ThreadID.l
EndStructure

If InitNetwork() = 0
	MessageRequester("Error", "No Network valid Stack found", 0)
	End
EndIf

Procedure OpenNetworkConnectionThread(*COM.CON_THREAD)
	Protected ConnectionID.l

	ConnectionID = OpenNetworkConnection(PeekS(*COM\IP), *COM\Port)
	If ConnectionID = 0
		*COM\CID = -1
	Else
		*COM\CID = ConnectionID
	EndIf
	*COM\ThreadID = 0

EndProcedure

Procedure.s IsEntry(Entry.s,Zeile.s)
	Entry +"="
	If Left(UCase(Zeile),Len(Entry))=UCase(Entry)
		ProcedureReturn Right(Zeile,Len(Zeile)-Len(Entry))
	EndIf

EndProcedure
Procedure ScanFreeDBResult(Content.s)
	Repeat
		Zeile.s = StringField(Content.s, i, Chr(10))
		i+1

		Entry.s="discid":If IsEntry(entry,Zeile.s)<>"":cd\discid + IsEntry(entry,Zeile):EndIf

		Entry.s="dtitle":
		If IsEntry(entry,Zeile.s)<>""

			cd\Author + IsEntry(entry,Zeile)
			p=FindString(cd\Author,"/",1)
			If p
				cd\album=Right(cd\Author ,Len(cd\Author)-p)
				cd\Author =Left(cd\Author ,p-1)
			EndIf
		EndIf

		Entry.s="dgenre":If IsEntry(entry,Zeile.s)<>"":cd\genre + IsEntry(entry,Zeile):EndIf
		Entry.s="dyear":If IsEntry(entry,Zeile.s)<>"":cd\Year + IsEntry(entry,Zeile):EndIf

		For T=1 To 30
			Entry.s="ttitle"+Str(T):If IsEntry(entry,Zeile.s)<>"":cd\title[t]+ IsEntry(entry,Zeile):EndIf
		Next

	Until Zeile.s=""
EndProcedure

Procedure Main()
	Protected ConVar.CON_THREAD, Connected.l = -1, HttpHeader.s, *Buffer, Received.s, Recv.l
	Protected Referer.s, UserAgent.s

	OpenWindow(0, 0, 0, 450, 340, "Test", #PB_Window_SystemMenu)
	CreateGadgetList(WindowID(0))
	;StringGadget(0, 5, 5, 350, 20, "/~cddb/cddb.cgi?cmd=cddb+lscat+&hello=test+localhost+Purebasic+4.10&proto=5")
	StringGadget(0, 5, 5, 350, 20, "/~cddb/cddb.cgi?cmd=cddb+Read+rock+9f0e010c&hello=test+localhost+Purebasic+4.10&proto=5")
	ButtonGadget(1, 360, 5, 80, 20, "Send")
	EditorGadget(2, 5, 35, 435, 300, #PB_Editor_ReadOnly)

	HttpHeader = "GET {HTTPGETCOMMAND} HTTP/1.0" + #CRLF$
	HttpHeader + "Referer: " + Referer           + #CRLF$
	HttpHeader + "User-Agent: " + UserAgent      + #CRLF$
	HttpHeader + #CRLF$ + #CRLF$

	ConVar\IP   = @"freedb.freedb.org"
	ConVar\Port = 80
	*Buffer     = AllocateMemory(8192)

	Repeat
		Select WaitWindowEvent(Connected)
			Case #PB_Event_CloseWindow
				Break
			Case #PB_Event_Gadget
				Select EventGadget()
					Case 0
						If EventType() = #PB_EventType_Change
							If GetGadgetText(0)
								DisableGadget(1, 0)
							Else
								DisableGadget(1, 1)
							EndIf
						EndIf
					Case 1
						If ConVar\ThreadID
							KillThread(ConVar\ThreadID)
						EndIf
						ConVar\CID      = 0
						Connected       = 15
						ConVar\ThreadID = CreateThread(@OpenNetworkConnectionThread(), @ConVar)
						ClearGadgetItemList(2)
						DisableGadget(0, 1)
						DisableGadget(1, 1)
				EndSelect
		EndSelect
		If Connected = 15 And ConVar\CID <> 0
			If ConVar\CID <> -1
				SendNetworkString(ConVar\CID, ReplaceString(HttpHeader, "{HTTPGETCOMMAND}", GetGadgetText(0)))
				Connected = 10
			Else
				AddGadgetItem(2, -1, "Unable to reach Host")
				DisableGadget(0, 0)
				DisableGadget(1, 0)
				Connected = -1
			EndIf
		EndIf
		If ConVar\CID < -1 Or ConVar\CID > 0
			Select NetworkClientEvent(ConVar\CID)
				Case #PB_NetworkEvent_Data
					Recv = ReceiveNetworkData(ConVar\CID, *Buffer, 8192)
					If Recv > 0
						Received + PeekS(*Buffer, Recv)
						If Right(Received, 3) = "." + #CRLF$
							AddGadgetItem(2, -1, Received)

							ScanFreeDBResult(Received)
							Debug "CD-ID="+ cd\discid
							Debug "Interpret="+cd\Author
							Debug "Album="+cd\Album
							Debug "Genre="+cd\genre
							Debug "Year="+cd\Year
							For T=1 To 30
								If cd\title[t]<>""
									Debug "Track-"+Str(T)+"=" + cd\title[t]
								EndIf
							Next

							Received = ""
							DisableGadget(0, 0)
							DisableGadget(1, 0)
							CloseNetworkConnection(ConVar\CID)
							ConVar\CID = 0
							Connected  = -1
						EndIf
					EndIf
			EndSelect
		EndIf

	ForEver

	If ConVar\CID < -1 Or ConVar\CID > 0
		CloseNetworkConnection(ConVar\CID)
	ElseIf ConVar\ThreadID
		KillThread(ConVar\ThreadID)
	EndIf
	FreeMemory(*Buffer)

EndProcedure

Main()
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

so, nun mal experiementell auch die länge ermitteln der
einzelnen tracks.

Code: Alles auswählen

Structure Struc_CD_Info
   DiscId.s
   Author.s
   Album.s
   AlbumLength.l
   Genre.s
   Year.s
   title.s[31]
   titleFrameoffset.l[31]
   titlelength.l[31]
   
EndStructure
Global CD.Struc_CD_Info

Structure CON_THREAD
   CID.l
   *IP
   Port.l
   ThreadID.l
EndStructure

If InitNetwork() = 0
   MessageRequester("Error", "No Network valid Stack found", 0)
   End
EndIf

Procedure OpenNetworkConnectionThread(*COM.CON_THREAD)
   Protected ConnectionID.l

   ConnectionID = OpenNetworkConnection(PeekS(*COM\IP), *COM\Port)
   If ConnectionID = 0
      *COM\CID = -1
   Else
      *COM\CID = ConnectionID
   EndIf
   *COM\ThreadID = 0

EndProcedure

Procedure.s IsEntry(Entry.s,Zeile.s)
   Entry +"="
   If Left(UCase(Zeile),Len(Entry))=UCase(Entry)
      ProcedureReturn Right(Zeile,Len(Zeile)-Len(Entry))
   EndIf

EndProcedure
Procedure ScanFreeDBResult(Content.s)
   Repeat
      Zeile.s = StringField(Content.s, i, Chr(10))
      i+1

      Entry.s="discid":If IsEntry(entry,Zeile.s)<>"":cd\discid + IsEntry(entry,Zeile):EndIf

      Entry.s="dtitle":
      If IsEntry(entry,Zeile.s)<>""

         cd\Author + IsEntry(entry,Zeile)
         p=FindString(cd\Author,"/",1)
         If p
            cd\album=Right(cd\Author ,Len(cd\Author)-p)
            cd\Author =Left(cd\Author ,p-1)
         EndIf
      EndIf

      Entry.s="dgenre":If IsEntry(entry,Zeile.s)<>"":cd\genre + IsEntry(entry,Zeile):EndIf
      Entry.s="dyear":If IsEntry(entry,Zeile.s)<>"":cd\Year + IsEntry(entry,Zeile):EndIf

      For T=1 To 30
         Entry.s="ttitle"+Str(T):If IsEntry(entry,Zeile.s)<>"":cd\title[t]+ IsEntry(entry,Zeile):EndIf
      Next
      
      
      
      ;get complete length of cd
      If Left(Zeile,Len("# Disc length:"))= "# Disc length:" 
       temp.s=Right(Zeile,Len(Zeile)-Len("# Disc length:"))
       p=FindString(temp,"seconds",1)
       If p
        temp=Trim(Left(temp,p-1))
        cd\Albumlength=Val(temp) ;in seconds
        EndIf
       ;now calculate complete length of tracks
        For p=1 To StartTrackoffset
        
          d.d=cd\titleFrameoffset[p+1]-cd\titleFrameoffset[p]
          d=d/75.2
          Debug Str(p)+":"+Str(d) 
          If d<0 
           ;last entry correcting
           d=(cd\Albumlength*75.2)-cd\titleFrameoffset[p]
           d=d/75.2
          EndIf
          cd\titlelength[p]=d
        Next
        StartTrackoffset=0
       EndIf
     
      If Left(Zeile,Len("# Track frame offsets:"))="# Track frame offsets:"
       StartTrackoffset=1
      EndIf
      If StartTrackoffset>0 
       If Left(Zeile,Len("#        "))="#        "
        temp=Right(Zeile,Len(zeile)-Len("#        "))
        If Trim(temp)<>""
         l=Val(temp)
         cd\titleFrameoffset[StartTrackoffset-1]=l
         StartTrackoffset +1 
        EndIf
       EndIf
      
      EndIf
       
; #        150
; #        21517
; #        45542
; #        66242
; #        88112
; #        127940
; #        152520
; #        176680
; #        194077
; #        219215
; #        225647
; #        241252
; #
; # Disc length: 3587 seconds

   Until Zeile.s=""
   
   
EndProcedure

Procedure Main()
   Protected ConVar.CON_THREAD, Connected.l = -1, HttpHeader.s, *Buffer, Received.s, Recv.l
   Protected Referer.s, UserAgent.s

   OpenWindow(0, 0, 0, 450, 340, "Test", #PB_Window_SystemMenu)
   CreateGadgetList(WindowID(0))
   ;StringGadget(0, 5, 5, 350, 20, "/~cddb/cddb.cgi?cmd=cddb+lscat+&hello=test+localhost+Purebasic+4.10&proto=5")
   StringGadget(0, 5, 5, 350, 20, "/~cddb/cddb.cgi?cmd=cddb+Read+rock+9f0e010c&hello=test+localhost+Purebasic+4.10&proto=5")
   ButtonGadget(1, 360, 5, 80, 20, "Send")
   EditorGadget(2, 5, 35, 435, 300, #PB_Editor_ReadOnly)

   HttpHeader = "GET {HTTPGETCOMMAND} HTTP/1.0" + #CRLF$
   HttpHeader + "Referer: " + Referer           + #CRLF$
   HttpHeader + "User-Agent: " + UserAgent      + #CRLF$
   HttpHeader + #CRLF$ + #CRLF$

   ConVar\IP   = @"freedb.freedb.org"
   ConVar\Port = 80
   *Buffer     = AllocateMemory(8192)

   Repeat
      Select WaitWindowEvent(Connected)
         Case #PB_Event_CloseWindow
            Break
         Case #PB_Event_Gadget
            Select EventGadget()
               Case 0
                  If EventType() = #PB_EventType_Change
                     If GetGadgetText(0)
                        DisableGadget(1, 0)
                     Else
                        DisableGadget(1, 1)
                     EndIf
                  EndIf
               Case 1
                  If ConVar\ThreadID
                     KillThread(ConVar\ThreadID)
                  EndIf
                  ConVar\CID      = 0
                  Connected       = 15
                  ConVar\ThreadID = CreateThread(@OpenNetworkConnectionThread(), @ConVar)
                  ClearGadgetItemList(2)
                  DisableGadget(0, 1)
                  DisableGadget(1, 1)
            EndSelect
      EndSelect
      If Connected = 15 And ConVar\CID <> 0
         If ConVar\CID <> -1
            SendNetworkString(ConVar\CID, ReplaceString(HttpHeader, "{HTTPGETCOMMAND}", GetGadgetText(0)))
            Connected = 10
         Else
            AddGadgetItem(2, -1, "Unable to reach Host")
            DisableGadget(0, 0)
            DisableGadget(1, 0)
            Connected = -1
         EndIf
      EndIf
      If ConVar\CID < -1 Or ConVar\CID > 0
         Select NetworkClientEvent(ConVar\CID)
            Case #PB_NetworkEvent_Data
               Recv = ReceiveNetworkData(ConVar\CID, *Buffer, 8192)
               If Recv > 0
                  Received + PeekS(*Buffer, Recv)
                  If Right(Received, 3) = "." + #CRLF$
                     AddGadgetItem(2, -1, Received)

                     ScanFreeDBResult(Received)
                     Debug "CD-ID="+ cd\discid
                     Debug "Interpret="+cd\Author
                     Debug "Album="+cd\Album
                     Debug "Genre="+cd\genre
                     Debug "Year="+cd\Year
                     Debug "Length="+Str(cd\Albumlength) + " seconds"
                     For T=1 To 30
                        If cd\title[t]<>""
                           Debug "Track-"+Str(T)+"=" + cd\title[t] + "  "+ Str(    cd\titlelength[t] ) +" sec."
                        EndIf
                     Next

                     Received = ""
                     DisableGadget(0, 0)
                     DisableGadget(1, 0)
                     CloseNetworkConnection(ConVar\CID)
                     ConVar\CID = 0
                     Connected  = -1
                  EndIf
               EndIf
         EndSelect
      EndIf

   ForEver

   If ConVar\CID < -1 Or ConVar\CID > 0
      CloseNetworkConnection(ConVar\CID)
   ElseIf ConVar\ThreadID
      KillThread(ConVar\ThreadID)
   EndIf
   FreeMemory(*Buffer)

EndProcedure

Main() 
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

@alen: reicht das fürs erste ?
mich selbst würde noch interessieren wie du die ID der cd
ermittelst, so das ich mal andere cd's testen kann hier.
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Beitrag von alen »

Rings hat geschrieben:reicht das fürs erste ?
mich selbst würde noch interessieren wie du die ID der cd
ermittelst, so das ich mal andere cd's testen kann hier.
@Rings:
Hallo Rings,

Klar reicht erstmal, das schon mehr Feedback als ich erwartet hatte, ich bin begeistert ! Das ganze muss ich nun noch sichten, verstehen und dann einbauen. Da ich bei Purebasic noch nicht so fit bin und noch übe, sehen meine Quellcodes nicht so komplex und effektiv aus aber sie funktionieren auch.

Hier habe ich mal meine derzeitige Version der DiscID Berechnung beigelegt.

Code: Alles auswählen

Global NewList StartTrackList()
Global NumberOfDrives = InitAudioCD()

Procedure.s GetHourFormat(LengthInSeconds)
  Minutes = LengthInSeconds / 60
  Seconds = LengthInSeconds - Minutes * 60
  
  If Seconds < 10 
    Null.s = "0"
  Else
    Null.s = ""
  EndIf
  
  ProcedureReturn RSet(Str(Minutes),2,"0")+":" + Null.s + Str(Seconds)
EndProcedure

Procedure.l SumDigits(numbers)
  While numbers > 0
    qs = qs + (numbers % 10)
    numbers = numbers / 10
  Wend
  ProcedureReturn qs
EndProcedure

Procedure.s CalcRawDiscID(StartTrackList()) 
  Counter = 1
  ForEach StartTrackList()
    track_length = AudioCDTrackLength(Counter)
    total_length + track_length
    CheckSum + SumDigits(StartTrackList())                
    Counter + 1
  Next
  
  Temp    = (CheckSum % $FF) << 24
  
  XX.s    = LCase(RSet(Hex(Temp), 2, "0"))               
  YYYY.s  = LCase(RSet(Hex(AudioCDLength()), 4, "0"))
  ZZ.s    = LCase(RSet(Hex(AudioCDTracks()), 2, "0"))
  
  RawDiscID.s = XX.s + YYYY.s + ZZ.s  
  ProcedureReturn RawDiscID.s
EndProcedure

Procedure CreateTrackList() 
  If NumberOfDrives > 0
    For Drive = 1 To NumberOfDrives
      UseAudioCD(Drive-1)
      If AudioCDTracks() > 0
        NumTracks     = AudioCDTracks() 
        InsertElement(StartTrackList())
        StartTrackList() = 2
        
        For Track = 1 To NumTracks          
          StartTimeTrack = StartTimeTrack + AudioCDTrackLength(Track)
          AddElement(StartTrackList())
          StartTrackList()  = StartTimeTrack
        Next
        
        LastElement(StartTrackList())
        DeleteElement(StartTrackList())     
      EndIf
    Next
  EndIf  
EndProcedure


If NumberOfDrives = 0
  MessageRequester("Fehler", "Keine CD-Audio Laufwerke gefunden", 0)
  End
Else
  ClearList(StartTrackList()) 
  CreateTrackList()
  
  RawDiscID.s = CalcRawDiscID(StartTrackList())
  
  Debug "*** DiscID ***"
  Debug RawDiscID
  Debug ""
  
  Debug "*** Startzeiten der Tracks ***"
  ForEach StartTrackList()
    Debug GetHourFormat(StartTrackList())
  Next
EndIf
Auch noch Danke an alle die sich hierfür interessieren und Tipps und Code beisteuern.

Grüße
Alen
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Danke dir, endlich hab ich sogar ne Funktion zur ID ermittlung
die ohne jegliche Api auskommt. Genial.
Und an alle anderen, so sollte Code-Sharing funktionieren ;)
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

??
Seit wann gibts denn die AudioCD-Funktionen in PB ?
Hab ich die jetzt jahrelang überlesen, oder sind die doch etwas neuer ?
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

HeX0R hat geschrieben:??
Seit wann gibts denn die AudioCD-Funktionen in PB ?
Hab ich die jetzt jahrelang überlesen, oder sind die doch etwas neuer ?
Die haste wohl jahrelang überlesen ;)

Naja zumindest das "native" abspielen ist schon länger möglich... ob das mit den AudioCDTrackLength() usw genauso ist, kann ich dir auch nicht sagen, habs nie benutzt ;)

@alen: könntest du die beschreibungen irgendwo hochladen ? bei freedb.org lassen sie sich nicht runterladen... (erledigt)

EditEdit : http://www.public.planetmirror.com/pub/freedb/misc/?fl= ist ein Mirror falls die DL-Links bei jemanden ebenfalls nicht funktionieren sollten
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Ich experimentiere hier an dem discid empfangen rum, aber ich bekomme immer nur die erste ID und trackdaten von freedb zurück, obwohl es mehrere CD's mit der ID gibt. Wie bau ich den Query an den Server so um damit der alle ID's und deren daten anzeigt, so wie auf der seite : http://www.freedb.org/freedb_discid_check.php ???
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Die Sache mit den mehrfachen DiscIDs

Beitrag von alen »

Bisonte hat geschrieben:Ich experimentiere hier an dem discid empfangen rum, aber ich bekomme immer nur die erste ID und trackdaten von freedb zurück, obwohl es mehrere CD's mit der ID gibt. Wie bau ich den Query an den Server so um damit der alle ID's und deren daten anzeigt, so wie auf der seite : http://www.freedb.org/freedb_discid_check.php ???
@Bisonte:

Hei Bisonte,

so wie ich das verstanden habe, ist das kein Problem des Query. Meine Beobachtungen gehen in die Richtung das es in unterschiedlichen Genres die gleichen IDs zu finden sind. Das würde heissen man müsste für jedes Genre eine eigene Query erzeugen und jeden Treffer dann anzeigen oder weiterverarbeiten.

Ich denke wenn Du eine Query mit einer DiscID bei FreeDB über die erweiterte Suche im Web Interface machst, die zu mehreren Ergebnissen führt, wird in allen Genres danach gesucht und alle Ergebnisse angezeigt.

Ob es tatsächlich gleiche IDs im selben Genre gibt kann ich nicht sagen da ich so einen Fall noch nicht hatte. Die ID ist ja auch nur dann gleich wenn zufällig die Gesamtlänge und die Längen der Einzelstücke übereinstimmen.

Aber wie gesagt, ich hatte auch noch nicht alle theoretisch vorkommenden Fälle.

Grüße
Alen
Antworten