Jose's Read Only Forum 2023

IT-Berater: Theo Gottwald (IT-Consultant) => General Tips and Discussion => Topic started by: Peter Weis on February 12, 2014, 07:35:07 PM

Poll
Question: besteht intresse daran dann werde ich weider arbeiten
Option 1: soll ich daran bleiben votes: 1
Option 2: soll ich es löschen votes: 0
Title: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on February 12, 2014, 07:35:07 PM
Habe wieder mal was aufgearbeitet für PBwin 10 werde den Quellcode in den Nächsten Tagen veröffentlichen. Muss  noch ein paar Sachen aufarbeiten. ist ein COM Objekt lässt sich von Excel und Word aufrufen, geht aber auch eigenständig!  Hiermit lässt sich eine Audio CD auslesen und eine CD Datenbank erstellen. Das Objekt ließt automatisch aus dem Internet Titel einer CD

Den Quellcode habe ich dazu gepackt!

Grüße Peter
Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Patrice Terrier on February 14, 2014, 08:53:31 AM
Google translation:
QuoteHave again what worked for PBwin 10 will release the source code in the next days. Still needs a few things worked up. is a COM object can be called from Excel and Word, but is also independently! This allows to read an audio CD and create a CD database. The object reads from the Internet automatically tracks on a CD

QuoteSo here's the source code
Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on February 16, 2014, 05:30:18 PM
Hallo

Um das Objekt in Excel oder Word zu nutzen muss folgendes Programm als Administrator ausgeführt werden


'------------------------------------------------------------------------------
'
'  Register the pbfree.dll COM Server
'  Copyright (c) 2014 Peter Weis
'  All Rights Reserved.
'
'
'------------------------------------------------------------------------------

#COMPILE EXE
#DIM ALL

DECLARE FUNCTION DllRegisterServer LIB ".\pbfreedb.dll" ALIAS "DllRegisterServer"   AS LONG

FUNCTION PBMAIN () AS LONG
  LOCAL i AS LONG

  i = DllRegisterServer
  IF i = %S_OK THEN
    ? "Registration of PBFREEDB.dll was successful"
  ELSE
    ? "Registration of PBFREEDB.dll has failed"
  END IF

END FUNCTION
                             



in Windows XP geht das aber einfacher man braucht nur pbfreedb mit regsvr32 auszuführen!

Habe das Project neu gepackt und oben dazu gefügt

nach dem erfolgreichen registrieren der dll muss im Com Browser folgende Zeile erscheinen

die Einbindung des Objects unter Excel oder Word  bedarf es leider einer 32Bit Version von Excel oder Word In der 64 Bit Version geht es nicht! Beispiel und Beschreibung folgt! :)

Ist das Hauptprogramm in PowerBASIC geschrieben geht es auch mit Excel und Word 64!   



Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on February 17, 2014, 05:04:15 PM
Nächster Schritt für die Verwendung mit Excel. Das gilt für Office ab Version 2007! Bei früheren Versionen ist das nicht nötig!

Die Entwickler Tools müssen eingeschaltet werden.
(https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-prn2/t1/1897757_724939780873725_1753152029_n.jpg)

(https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-prn2/t1/1901274_724940617540308_38451307_n.jpg)
Das geht so wie oben im Bild beschrieben.

Also Excel Optionen einstellen!

Dabei Entwickler Tools aktivieren

Excel müßte dann so ausschauen das Tab mit Entwickler Tools siehe Bild unten müßte erscheinen.
(https://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-prn2/t1/1601302_724975670870136_1619879324_n.jpg)


Als nächstes bitte die das Tab Entwickler Tools anwählen das erscheint das Button ,,Code Anzeigen" das müssen sie auswählen

(https://fbcdn-sphotos-b-a.akamaihd.net/hphotos-ak-ash4/t1/1656426_725356867498683_1524349734_n.jpg)

Es erscheint dann die VBA Umgebung von Excel. Bitte wählen sie hier den Menüpunkt ,,Extras" an!

(https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-frc3/t1/1506945_725365320831171_2107045352_n.jpg)

Hier dann den Menüpunkt Verweise auswählen.

(https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-ash3/t1/1904180_725397207494649_594901198_n.jpg)

Hier bitte den Verweis pbfreedb anwählen. Danach kann dann das VBA Programm geschrieben werden das das Objekt nutzt

(https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-prn2/t1/1780835_725400550827648_2059093858_n.jpg)

Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on March 01, 2014, 01:23:51 AM
Hallo,
Wichtig ist dem Objekt die Objekt Variable zu übergeben! da diese intern für Funktionen benötigt wird


Public Sub freedbinit()

Set cfreedb = New FREEDB

initcfreedb cfreedb

   
    App.Title = ThisWorkbook.Name
    App.Major = "1"
    App.Minor = "1"
   
    combo3() = Split(cfreedb.GETCDROMS, "|")
   
    cda = 1
    For i = LBound(combo3) To UBound(combo3)

        If cfreedb.GetMediaInfo(combo3(i)) <> "" Then
            CdAudio = cda
            Exit For
        End If
        cda = cda + 1
    Next i
   
    cfreedb.APPNAME = App.Title
    cfreedb.APPVERSION = App.Major & "." & App.Minor

    cfreedb.EMAILADDRESS = "peter.weis@freenet.de"
    cfreedb.CDDBSERVER = "freedb.freedb.org"

    cfreedb.CDDBINTERFACE = AUTO
    cfreedb.CDDBMODE = SUBMIT                 '%TEST
    cfreedb.USEFIRSTMATCH = True
    cfreedb.ALLOWSUBMISSION = False
    cfreedb.INTERNETENABLE = True
    With UserForm1
   
        .CommandButton1.Enabled = False
   
                                         
        For i = 0 To UBound(combo3()) - 1
            .ComboBox1.AddItem (combo3(i))
       
        Next i
    End With
   
End Sub



(https://fbcdn-sphotos-b-a.akamaihd.net/hphotos-ak-frc1/t31/1796056_730514223649614_1612521075_o.jpg)
Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on March 01, 2014, 01:50:47 AM
Im Übrigen habe das Objekt an die neuen Versionen von Office angepasst da die nur noch mit Unicode Strings zurechtkommen. Das Objekt steht oben zum Download bereit
Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on March 06, 2014, 12:51:28 AM
Hallo Freunde,

Hab festgestellt das es noch zwei Probleme bei der Anbindung an  Excel gibt ein Problem ist, das Excel das Laufwerk nicht mehr frei gibt das einmal gescannt wurde! komischerweise hatte ich das Problem nicht mit älteren Versionen von Excel.

Das andere Problem ist das PowerBasic die Attribute bei der Parameterübergabe nicht in die Typelib schreibt was ich schon in der Version 9 von PowerBASIC moniert habe! So können keine Optionalen Parameter übergeben werden

Bin aber dran die Probleme zum Beseitigen!

Grüße Peter
Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on March 06, 2014, 11:02:38 PM
Hallo,
sieht doch heute mal nicht schlecht aus bin weiter gekommen.
Wie man sieht liest das Objekt von CD und holt sich dann die dazugehörigen Titel aus dem Internet ;D
(https://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-prn2/t31/1911221_733769763324060_1650576168_o.jpg)

Dafür müssen aber die Makros in Excel   für die Tabelle aktiviert werden siehe hier

(https://scontent-a-cdg.xx.fbcdn.net/hphotos-ash3/t31/1960928_733771973323839_1800550852_o.jpg)

Im nächsten Schritt muss der Makro gestartet werden.

(https://fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-frc3/t31/1798985_733772406657129_2094579241_o.jpg)

Dann sollte dieser einfache Dialog erscheinen. Bei dem man das CD Laufwerk auswählt das Button sollte dann freigegeben werden! Und man kann sich die Daten aus dem Internet holen. Natürlich muss auch eine Audio CD im Laufwerk liegen

(https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-frc1/t31/1890542_733772769990426_1118713998_o.jpg)

Den Code hab ich natürlich wieder oben dazu gelegt!
Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on March 07, 2014, 10:40:06 PM
Das Com Objekt beinhaltet auch noch mehrere Dialog. z.B die Serverauswahl oder wen mehrere Möglichkeiten auf dem Server liegen! Damit man darauf einen Zugriff hat muss man dem Objekt das Handle des aktuellen Fenster übergeben. das hat mir wirklich etwas Kopfzerbrechen bereitet. Da man in VBA eigentlich nicht mit Handles arbeitet. Habe aber eine Lösung gefunden! ;)



Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Sub CommandButton1_Click()
    Call sethandle(whandle)
    Call BUTTONQUERY
    UserForm1.Hide
   
End Sub

Private Sub UserForm_Activate()
   
    If Val(Application.Version) >= 9 Then
        whandle = FindWindow("ThunderDFrame", Me.Caption)
    Else
        whandle = FindWindow("ThunderXFrame", Me.Caption)
    End If
   
   
End Sub
   

(https://scontent-a-cdg.xx.fbcdn.net/hphotos-prn1/t31/1606476_734230849944618_1834445476_o.jpg)

Ergebnis wen mehrere Titel von einer CD auf Server Liegen. Habe wieder alles gepackt und am ersten Topic hinzugefügt

Grüße Peter
Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on March 13, 2014, 06:26:05 PM
Hallo ,
Eigentlich wollte ich jetzt daran arbeiten wie man die Typelib verändern kann, so das man auch Optionale Parameter nutzen kann. Nach dem ich aber im Internet gelesen hab das das Vivian Zale in den nächsten Tagen was neues bringen möchte, weil sie ein neues Team hat warte ich da mal! Werde ich euch mal aufzeigen wie man nach verschiedenen Methoden mit  dem Objekt suchen kann!

Einmal klar über freedb server

Zum zweiten über FREEDB Files die sich am Rechner befinden. Dafür muss die Datenbank hier herunter geholt werden http://www.freedb.org/en/download__database.10.html und entpackt  werden
(https://scontent-a-cdg.xx.fbcdn.net/hphotos-ash3/t1/1911603_737138932987143_2070054267_n.jpg)


Zum dritten über DAO Datenbank. Die aber noch ein Problem hat weil die Datenbank über zwei  Gig hat  dieses Problem muss ich auch noch lösen. Mikrosoft Access  lässt  nämlich nur zwei  Gig zu. Ich muss die Datenbank splitten.

(https://fbcdn-sphotos-b-a.akamaihd.net/hphotos-ak-ash3/t1.0-9/1959381_737136812987355_886434311_n.jpg)
 
Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on March 15, 2014, 09:30:08 AM
Etwas verrückt aber es ist so  :-[

VBA unterstützt bei Aufruf von Funktionen in DLL nur ANSI Strings, keine Unicode Strings. Bei Objekten ist das anders da werden nur Unicode Strings erwartet.

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
    ByVal lpClassName As String, ByVal lpWindowName As String) As Long
   
   
Private Declare Function BrowseForDirectoryA Lib "pbfreedb" ( _
    ByVal hwnd As Long, _
    ByVal Title As String, _
    Optional showFiles As Integer, _
    Optional startDir As String) As String


Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on March 16, 2014, 01:18:22 PM
habe die Funktionen BrowseForDirectoryA und BrowseForDirectoryW umgeschrieben und durch neuen Dialog Style ersetzt schaut moderner aus und ist hundert mal schneller ;D als der alte Dialog.


'*****************************************
'** Browse for Directory / Files Dialog **
'*****************************************
FUNCTION BrowseForDirectoryW ALIAS "BrowseForDirectoryW" (BYVAL hwnd AS LONG, BYVAL Title AS WSTRING, _
                                   BYVAL uflags AS LONG, _
                                   OPT startDir AS WSTRING) EXPORT AS WSTRING
    DIM lpIDList AS LONG
    DIM iNull AS INTEGER
    DIM sPath AS WSTRINGZ * %MAX_PATH
    DIM BrInfo AS BrowseInfoW
    STATIC zstartDir AS WSTRINGZ * %MAX_PATH


    BrInfo.hWndOwner    = hwnd
    BrInfo.lpszTitle    = STRPTR(Title)
    zstartdir           = startDir
    BrInfo.lparam       = VARPTR(zstartdir)
    BrInfo.ulFlags      = uflags OR %BIF_NEWDIALOGSTYLE
    BrInfo.pidlroot     = 0
    BrInfo.lpfnCallback = CODEPTR(BrowseCallbackProcW)

    'set for call back...
    'm_CurrentDirectoryW = startDir

    'pop up dialog...
    lpIDList = SHBrowseForFolderW(BrInfo)
    IF (lpIDList) THEN
        'sPath = Space$(260)

        'convert id to path
        IF SHGetPathFromIDListW(BYVAL lpIDList, sPath) THEN
            BrowseForDirectoryW = sPath
        END IF

        'we must free the memory...
        CALL CoTaskMemFree(lpIDList)
    END IF
END FUNCTION
                         


(https://fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-ash3/t31/1025580_738492909518412_97466562_o)
Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on March 22, 2014, 10:45:01 PM
Hallo habe wieder ein paar Änderungen vorgenommen damit die Sache stabiler läuft

zum ersten habe ich die Objekte die das Interface ICollection benötigen nicht mehr Global definiert sondern sondern als Instanz definiert!



der Aufruf bei global war unter Excel nur einmal möglich!

    INSTANCE colTrackNames          AS ICollection
    INSTANCE colTrackCDNames        AS ICollection
    INSTANCE colTrackTimes          AS ICollection
    INSTANCE colTrackNotes          AS ICollection
    INSTANCE colServers             AS ICollection
                                                   


dafür musste ich aber  die Funktion DetectAudio in die Classe als CLASS Methode aufnehmen die vorher außerhalb war

Zum zweiten habe ich einen Timer eingefügt der während der Laufzeit überwacht ob das CD Laufwerk eine Audio-CD enthält!

Option Explicit
Public Declare Sub initcfreedb Lib "pbfreedb.dll" Alias "inintcfreedb" (par As PFREEDB)
Private Declare Function FindWindow Lib "user32" Alias "FindWindowW" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
   
Private Declare Function SetTimer Lib "user32.dll" ( _
  ByVal hWnd As Long, _
  ByVal nIDEvent As Long, _
  ByVal uElapse As Long, _
  ByVal lpTimerFunc As Long) As Long

Private Declare Function KillTimer Lib "user32.dll" ( _
  ByVal hWnd As Long, _
  ByVal nIDEvent As Long) As Long
 
Private Declare Function GetDriveType Lib "kernel32.dll" _
  Alias "GetDriveTypeA" ( _
  ByVal nDrive As String) As Long
 

Const WM_TIMER = &H113 ' Timer-Ereignis trifft ein
   
Private hEvent As Long
Private TocTxT As String
       



Const MAX_PATH = 260
Const MATCH_NONE = 0
Const AUTO = 0
Const SUBMIT = 1
Const MCI = 3
Const SPI = 1

Const DRIVE_CDROM = 5




Private Type AppType
    Title       As String * 50
    Major       As String * 4
    Minor       As String * 4
    Revision    As String * 4
    PATH        As String * MAX_PATH


End Type

Public Type freedbconfig
    dbfolter            As String * MAX_PATH
    drive               As String * 20
    InternetEnable      As Integer
    QueryLocalDatabase  As Integer
   
   
End Type

Public dbfreec As freedbconfig

                 

Dim App              As AppType

Public cfreedb As FREEDB
Dim combo3() As String

' Timer-Prozedur, welche im Abstand der festgelegten
' Millisekunden ein Ereignis sendet
Public Sub TimerProc(ByVal hWnd As Long, ByVal uMsg As Long, _
  ByVal wParam As Long, ByVal lParam As Long)

  'Dim ST As SYSTEMTIME

  If uMsg = WM_TIMER Then
    DisableTimer
    initdrive
    EnableTimer 200
    ' Lokale Zeit ermitteln...
    ' GetLocalTime ST

    ' ... und im Labelfeld der Form anzeigen
    'Form1.Label1.Caption = Format$(ST.wHour, "00:") & _
    '  Format$(ST.wMinute, "00:") & Format$(ST.wSecond, "00 Uhr")
  End If
End Sub


' Startet den Timer
Public Function EnableTimer(ByVal msInterval As Long)
  If hEvent <> 0 Then Exit Function
  hEvent = SetTimer(0&, 0&, msInterval, AddressOf TimerProc)
End Function

' Beendet den Timer
Public Function DisableTimer()
  If hEvent = 0 Then Exit Function
  KillTimer 0&, hEvent
  hEvent = 0
End Function



Public Sub freedbinit()
    If cfreedb Is Nothing Then
        Set cfreedb = New FREEDB
        initcfreedb cfreedb
    End If
   
    If cfreedb Is Nothing Then
        MsgBox "Programm kann nicht gestartet werden weil FREEDB nicht geladen wurde"
    Else
        Open "mape1.cfg" For Binary As #1
        Get #1, 1, dbfreec
        Close #1
       
        Dim cda, i, cdaudio As Integer
       
   
        App.Title = ThisWorkbook.Name
        App.Major = "1"
        App.Minor = "1"
   
        combo3() = Split(cfreedb.GetCdRoms, "|")
   
        cda = 1
        For i = LBound(combo3) To UBound(combo3)

            If cfreedb.GetMediaInfo(combo3(i)) <> "" Then
                cdaudio = cda
                Exit For
            End If
            cda = cda + 1
        Next i
       
        EnableTimer 200
   
        cfreedb.APPNAME = App.Title
        cfreedb.APPVERSION = App.Major & "." & App.Minor

        cfreedb.EMAILADDRESS = "peter.weis@freenet.de"
        cfreedb.CDDBSERVER = "freedb.freedb.org"

        cfreedb.CDDBINTERFACE = MCI
        cfreedb.CDDBMODE = SUBMIT                 '%TEST
        cfreedb.UseFirstMatch = False
        cfreedb.ALLOWSUBMISSION = True
        cfreedb.InternetEnable = dbfreec.InternetEnable
        cfreedb.QueryLocalDatabase = dbfreec.QueryLocalDatabase
       
        With UserForm1
   
            .CommandButton1.Enabled = False
   
                                         
            For i = 0 To UBound(combo3()) - 1
                .ComboBox1.AddItem (combo3(i))
               
               
               
            Next i
           
            .OptionButton10.Value = dbfreec.InternetEnable
            .OptionButton1.Value = dbfreec.QueryLocalDatabase
           
            If Trim(dbfreec.drive) <> "" Then
               .ComboBox1.Value = dbfreec.drive
            End If
            .TextBox1.Value = dbfreec.dbfolter
        End With
   
   
    End If

End Sub

Public Sub sethandle(ByVal handle As Long)
    cfreedb.ParentHandle = handle

End Sub

Public Sub BUTTONQUERY()
   
    Dim x As String
    Dim ret As Long
   
    x = cfreedb.pGetMediaTOC
     
       
    If x <> "" Then
        DisableTimer
        If cfreedb.LookupMediaByToc(x) = MATCH_NONE Then
    '        cfreedb.LOOKUPMEDIADIRBYTOC ("")
        End If
   
        If cfreedb.MatchCodeNum <> MATCH_NONE Then
            showInfo
        End If
        EnableTimer 200
    End If
                 

End Sub

Public Sub endprog()
    Set cfreedb = Nothing
    End
   
End Sub


Private Sub showInfo1()
    Dim x, y As Integer
   
    UserForm1.Hide
    Sheets(1).Select
    Cells.Select
    Selection.Delete Shift:=xlUp
    For x = 1 To 3
        For y = 1 To cfreedb.GetAlbumTracks
            Select Case x
                Case 1
                    Cells(y, x).Value = cfreedb.SecondsToTimeString(cfreedb.GetTrackTime(y))
                Case 2
                    Cells(y, x).Value = cfreedb.GetTrackName(y)
                Case 3
                    Cells(y, x).Value = cfreedb.GetTrackNotes(y)
                Case Else
            End Select
        Next y
   
   
    Next x
    Call endprog
End Sub

Public Sub initdrive()
    Dim s As String
   
    If GetDriveType(cfreedb.DriveLetter) = DRIVE_CDROM Then
   
        s = cfreedb.GetMediaTOC(cfreedb.DriveLetter)
        If s <> TocTxT Then
            TocTxT = s
            If TocTxT <> "" Then
                   
                cfreedb.LookupMediaDirByToc (TocTxT)
                showInfo
            Else
                UserForm1.ListView1.ListItems.Clear
            End If
        End If
    End If

End Sub

Private Sub showInfo()
    Dim x, y As Integer
   
    'UserForm1.Hide
    'Sheets(1).Select
    'Cells.Select
    'Selection.Delete Shift:=xlUp
   
    With UserForm1
        .ListView1.ListItems.Clear
        For x = 1 To 4
            For y = 1 To cfreedb.GetAlbumTracks
                Select Case x
                    Case 1
                        .ListView1.ListItems.Add , , Format(y, "##")
                                         
                    Case 2
                        .ListView1.ListItems(y).SubItems(1) = cfreedb.SecondsToTimeString(cfreedb.GetTrackTime(y))
                                       
                    Case 3
                        .ListView1.ListItems(y).SubItems(2) = cfreedb.GetTrackName(y)
                       
                    Case 4
                        .ListView1.ListItems(y).SubItems(3) = cfreedb.GetTrackNotes(y)
                    Case Else
                End Select
            Next y
        Next x
    End With
End Sub




Bin aber noch nicht ganz zufrieden! Ihr hört von mir
 
(https://scontent-a-fra.xx.fbcdn.net/hphotos-prn2/t31.0-8/1655474_741653775868992_382219379_o.jpg)


Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on March 25, 2014, 06:15:53 PM
Hallo,
kleine Ursache große Wirkung. Hatte bei der Übergabe des lokalen Ordner einen String fester Länge übergeben. Bei VBA Also MAX_PATH Zeichen, dieser wird von VBA in kompletter Länge übergeben. Die Methode QueryFlatFileSystem findet aber dann keine Übereinstimmungen mehr weil der Order auf der Festplatte nicht mehr gefunden wird!

Habe nun in Property CDDBFilePath ein Trim$ Funktion eingefügt damit diese Leerzeichen entfernt werden


        PROPERTY SET CDDBFilePath ALIAS "CDDBFilePath"(BYVAL strPath AS WSTRING)
            m_strCDDBFilePath = TRIM$(strPath)
        END PROPERTY       


Jetzt funktioniert auch die Suche mit VBA  mit lokaler Datenbank auf Rechner :)

(https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-frc1/t31.0-8/1606441_743085692392467_165665276_o.jpg)


Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on April 08, 2014, 07:21:07 PM
Hallo,
habe wieder mal ein bisserl was gemacht, habe das konvertieren in eine Access Datenbank umgeschrieben. Da das umwandeln mehrere Std dauert lasse ich das Ganze in einem THREAD im Hintergrund ablaufen, damit man mit dem während der  Zeit auch weiter arbeiten kann. 


THREAD FUNCTION CONVERT_MDB(BYVAL hdlg AS LONG) AS LONG
    LOCAL lRslt AS LONG
    LOCAL m_DBEngineidx, m_DBEngine AS Int_DBEngine
    LOCAL m_dbWorkspaces, m_dbWorkspacesidx AS Workspaces
    LOCAL m_dbWorkspace, m_dbWorkspaceidx AS Workspace
    LOCAL dbDatabase, dbDatabaseidx AS Database
    LOCAL dbRecordsetidx, dbRecordset  AS Recordset
    LOCAL dbTableDef       AS Int_TableDef
    LOCAL dbfields         AS fields
    LOCAL dbfield          AS Int_Field
    LOCAL dbTableDefs      AS TableDefs
    LOCAL DatabaseNr, i , dbupdate, Record AS LONG
    LOCAL file, f AS WSTRING
    STATIC dta AS DIRDATA
    LOCAL sFlag AS INTEGER
    DIM sFiles(0 TO 10) AS WSTRING


     'init the catagory array...
    sFiles(0) = "blues": sFiles(1) = "country": sFiles(2) = "classical"
    sFiles(3) = "data":  sFiles(4) = "folk":    sFiles(5) = "jazz"
    sFiles(6) = "misc":  sFiles(7) = "newage":  sFiles(8) = "reggae"
    sFiles(9) = "rock":  sFiles(10) = "soundtrack"

    #IF %DEF($PROGID_DAO_DBEngine36)
        m_DBEngineidx   =  ANYCOM $PROGID_DAO_DBEngine36
        m_DBEngine      =  ANYCOM $PROGID_DAO_DBEngine36
    #ELSE
        m_DBEngineidx   =  ANYCOM $PROGID_DAO_DBEngine120
        m_DBEngine      =  ANYCOM $PROGID_DAO_DBEngine120
    #ENDIF

    IF ISOBJECT(m_DBEngine) AND ISOBJECT (m_DBEngineidx) THEN
        m_dbWorkspaces      = m_DbEngine.Workspaces()
        m_dbWorkspacesidx   = m_DbEngineidx.Workspaces()
        m_dbWorkspace       = m_dbWorkspaces.Item(0)
        m_dbWorkspaceidx    = m_dbWorkspacesidx.Item(0)

    END IF


    IF ISOBJECT (cFREEDB) THEN
        IF cfreedb.DAOUpdateMode = %False THEN
            KILL cFREEDB.DAODir + "\" + "FREEDB*.MDB"


        END IF

        IF ISOBJECT(m_dbWorkspaceidx) AND ISOBJECT (m_dbWorkspace)THEN
            dbDatabaseidx = m_dbWorkspaceidx.OpenDatabase(cFREEDB.DAODir + "\" + "FREEDBIDX.MDB", %False, %False)
            IF ISFALSE ISOBJECT(dbDatabaseidx) THEN
                ERRCLEAR
                dbDatabaseidx = m_dbWorkspaceidx.CreateDatabase(cFREEDB.DAODir + "\" + "FREEDBIDX.MDB", $$dbLangGeneral)
            END IF


            dbrecordset = ObenDataBase(m_dbWorkspace, dbDatabase, DataBaseNr)





            IF ((ISFALSE ISOBJECT(dbDatabaseidx)) OR (ISFALSE ISOBJECT(dbDatabase))) THEN
                MSGBOX "Kann Datenbank FREEDB.MDB öffnen oder erstellen" & $CR & _
                        "Daten können dadurch nicht gespeichert werden", %MB_ICONERROR
                        FUNCTION = 0
                        EXIT FUNCTION
            ELSE
                dbrecordsetidx = dbDatabaseidx.OpenRecordset("FREEDBINDEX", %RecordsetTypeEnum.dbOpenDynaset, %RecordsetOptionEnum.dbDenyRead)
                IF ISFALSE ISOBJECT(dbrecordsetidx) THEN
                    ERRCLEAR
                    dbTableDef  = dbDatabase.CreateTableDef("FREEDBINDEX")
                    dbFields   = dbTableDef.Fields
                    dbfield = dbTableDef.CreateField("DISKID", %DataTypeEnum.dbLong)
                    dbFields.Append dbfield
                    dbfield = dbTableDef.CreateField("DATNR", %DataTypeEnum.dbInteger)
                    dbFields.Append dbfield
                    dbfield = dbTableDef.CreateField("RECNR", %DataTypeEnum.dbLong)
                    dbFields.Append dbfield

                    dbTableDefs = dbdatabaseidx.tabledefs
                    dbTableDefs.Append (dbTabledef)

                    dbDatabaseidx.TableDefs.Refresh
                    dbRecordsetidx  = dbTableDef.OpenRecordset(%RecordsetTypeEnum.dbOpenDynaset, %RecordsetOptionEnum.dbDenyRead)
                    dbField     = NOTHING
                    dbFields    = NOTHING
                    dbTableDef  = NOTHING
                    dbTableDefs = NOTHING




                END IF




                DO
                    IF IsFreeDBFile (cFREEDB.CDDBFilePath, sFiles(i), File, DTA, sFlag) THEN
                        IF FilelenOpen(cFREEDB.DAODir + "\" + "FREEDB" + FORMAT$(DatabaseNr, "00")+ ".MDB" ) > 1000000000 THEN
                            INCR DatabaseNr
                            dbrecordset.Close
                            dbrecordset = NOTHING
                            dbDatabase.close
                            dbDatabase = NOTHING
                            dbrecordset = ObenDataBase(m_dbWorkspace, dbDatabase, DataBaseNr)
                        END IF


                        Record = 0


                        CALL dbsetrecord(file, sfiles(i), DatabaseNr, Record, dbDatabase, dbrecordset)
                        dbrecordsetidx.addnew
                        dbrecordsetidx.collect(0) = VAL("&H"+(File))
                        dbrecordsetidx.collect(1) = DataBaseNr
                        dbrecordsetidx.collect(2) = Record
                        'dbrecordset.collect(1) = PBReadFile(f)
                        dbrecordsetidx.update %UpdateTypeEnum.dbUpdateRegular
                        CONTROL SET TEXT hdlg, %IDC_LABEL8, "FreeDB File: " + File
                        'CONTROL SET TEXT CB.HNDL, %IDC_LABEL9, "MDB Recordset: " + sFiles(I)
                        IF dbupdate THEN
                            f = "Update Record Nr: " + FORMAT$(Record, "#########")
                        ELSE
                            f = "Copy Record Nr: "+ FORMAT$(Record, "#########")
                        END IF
                        CONTROL SET TEXT hdlg, %IDC_LABEL10, f
                    ELSE
                        INCR i
                        IF i > 10 THEN EXIT DO
                    END IF

                LOOP
            END IF
        END IF
    END IF


    FUNCTION = lRslt
END FUNCTION                     


(https://fbcdn-sphotos-e-a.akamaihd.net/hphotos-ak-frc1/t31.0-8/1606521_489992544456775_8668184085897105235_o.jpg)

Zum zweiten habe ich ein paar Funktionen z. b. Filelen diese arbeitete mit Dir$ wen die Funktion in einen anderem Programm aufgerufen wurde arbeitete sie nicht mehr korrekt deswegen arbeite ich jetzt mit der Funktion FilelenOpen die jetzt die Windows  API Funktion FindFirstFileW benutzt



FUNCTION FilelenOpen(BYVAL s AS WSTRING) AS DWORD
    LOCAL FindFileData AS WIN32_FIND_DATAW
    LOCAL hFind AS LONG
    LOCAL temp AS WSTRING
    LOCAL temp2 AS WSTRING


    hFind = FindFirstFileW(BYVAL STRPTR(s), FindFileData)

    IF BITSE(hFind, %INVALID_HANDLE_VALUE, 32) THEN
        EXIT FUNCTION
    ELSE
        FindClose(hFind)


        zsplitW s, temp, temp2

        IF temp2 = FindFileData.cFileName THEN

            FUNCTION = FindFileData.nFileSizeLow
        END IF
    END IF

END FUNCTION
                         

Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on June 19, 2016, 08:43:28 PM
Hab es überarbeitet für Windows 10
Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Peter Weis on March 24, 2023, 10:46:47 PM
Hi hab festgestellt das PBFREE nicht mehr geht weil der Server FREEDB nicht mehr existiert >:(

ich bin aber am arbeiten daran um einen Ersatz zu finden wen jemand mir helfen kann mit dem einen anderen Server nutzen kann er mir gerne helfen

MFG Peter
Title: Re: pbfree lade Musik Title CD info von FreeDB sever automatisch
Post by: Theo Gottwald on March 25, 2023, 10:13:37 AM
Was gibt es da zu arbeiten?
Frag einfach ...
Für mich sind das nur wenige Klicks und ich weiss das.

QuoteDie FreeDB-Datenbank wurde ursprünglich von einem Community-Projekt betrieben, das die Metadaten von Audio-CDs sammelte und öffentlich zugänglich machte. Im Jahr 2020 gab das Projekt jedoch bekannt, dass es den Betrieb der FreeDB-Datenbank einstellen werde.

Seitdem haben sich verschiedene alternative CD-Datenbanken entwickelt, darunter MusicBrainz und Discogs. Diese Datenbanken haben ähnliche Ziele wie FreeDB, nämlich eine öffentlich zugängliche Sammlung von Metadaten für Audio-CDs bereitzustellen.

Es gibt verschiedene Möglichkeiten, auf die Datenbanken wie MusicBrainz oder Discogs zuzugreifen und ihre Metadaten abzufragen. Einige der gängigsten Methoden sind:

Verwendung von APIs: Diese Datenbanken bieten oft öffentliche APIs an, die es Entwicklern ermöglichen, auf ihre Daten zuzugreifen und Abfragen durchzuführen. Diese APIs verwenden normalerweise HTTP-Anfragen, um Daten zu übertragen, und geben die Ergebnisse im JSON- oder XML-Format zurück.

Verwendung von Bibliotheken: Es gibt verschiedene Bibliotheken und SDKs (Software Development Kits), die es einfacher machen, mit diesen Datenbanken zu interagieren. Diese Bibliotheken können in verschiedenen Programmiersprachen wie Python, Java oder C# verfügbar sein.

Verwendung von Datenbankabfragesprachen: Es ist auch möglich, Datenbankabfragesprachen wie SQL zu verwenden, um direkt auf die Datenbanken zuzugreifen und Abfragen auszuführen. Dies erfordert jedoch normalerweise spezielle Kenntnisse und Genehmigungen, um auf die Datenbanken zuzugreifen.

In jedem Fall ist es wichtig, die API-Dokumentation oder die Benutzerhandbücher der Datenbanken zu lesen, um zu verstehen, wie man auf ihre Daten zugreift und wie man Abfragen richtig formuliert.

... Musiktiteln, Künstlern und Alben zuzugreifen. Die API unterstützt eine Vielzahl von Abfragemöglichkeiten, einschließlich der Suche nach bestimmten Künstlern, Alben oder Tracks sowie der Abfrage von Metadaten basierend auf bestimmten Kriterien wie Erscheinungsjahr, Genre oder Land.

Die MusicBrainz API verwendet HTTP-Anfragen und gibt die Ergebnisse im JSON- oder XML-Format zurück. Die API unterstützt auch die Verwendung von Abfrageparametern, um die Abfrageergebnisse zu filtern oder zu sortieren.

Die vollständige Dokumentation der MusicBrainz API ist auf der offiziellen MusicBrainz-Website verfügbar. Dort findest du detaillierte Informationen zu den unterstützten Abfrageparametern und -optionen sowie Beispiele für die Verwendung der API in verschiedenen Programmiersprachen.

Ja, ich kann dir ein Beispiel für eine MusicBrainz-API-Abfrage geben.

Angenommen, du möchtest alle Alben von Queen abrufen. Die API-Abfrage würde folgendermaßen aussehen:

https://musicbrainz.org/ws/2/release?artist=0383dadf-2a4e-4d10-a46a-e9e041da8eb3&fmt=json
In dieser Abfrage wird die "release" Ressource angefordert, die alle veröffentlichten Alben darstellt. Der Parameter "artist" wird verwendet, um nach Alben des Künstlers mit der MusicBrainz-ID "0383dadf-2a4e-4d10-a46a-e9e041da8eb3" zu suchen. Dies ist die MusicBrainz-ID von Queen. Der Parameter "fmt" wird verwendet, um das Antwortformat auf JSON zu setzen.

Wenn du diese Abfrage in deinem Webbrowser eingibst, erhältst du eine JSON-Antwort mit allen Alben von Queen, die in der MusicBrainz-Datenbank erfasst sind. Diese Antwort enthält Informationen wie den Albumnamen, das Erscheinungsjahr, die Trackliste und die MusicBrainz-ID des Albums.

Dies ist nur ein einfaches Beispiel, und es gibt viele andere Möglichkeiten, die MusicBrainz-API zu nutzen, um detailliertere Abfragen durchzuführen oder andere Informationen wie Künstlerbiografien oder Songtexte abzurufen. Die genaue Abfrage hängt von deinen spezifischen Anforderungen ab.

Quote
Ja, es ist auch möglich, die MusicBrainz-API in C zu verwenden. Hier ist ein Beispielcode, der die Alben von Queen mit der MusicBrainz-ID "0383dadf-2a4e-4d10-a46a-e9e041da8eb3" abruft und die Albumtitel in der Konsole ausgibt:

#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>
#include <string.h>
#include <jansson.h>

size_t callback(char *ptr, size_t size, size_t nmemb, void *userdata) {
    // Diese Funktion wird vom CURL aufgerufen, um Daten von der API zu empfangen.
    // Hier wird der empfangene Inhalt an den JSON-Parser übergeben.
    size_t realsize = size * nmemb;
    json_error_t error;
    json_t *root = json_loads(ptr, 0, &error);
    if (root) {
        json_array_foreach(root, i, release) {
            json_t *title = json_object_get(release, "title");
            printf("%s\n", json_string_value(title));
        }
        json_decref(root);
    }
    return realsize;
}

int main() {
    CURL *curl;
    CURLcode res;
    char *url = "https://musicbrainz.org/ws/2/release?artist=0383dadf-2a4e-4d10-a46a-e9e041da8eb3&fmt=json";

    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }

    return 0;
}

In diesem Beispiel wird die CURL-Bibliothek verwendet, um die API-Anfrage an die MusicBrainz-Server zu senden und die empfangene Antwort zu verarbeiten. Die empfangenen Daten werden an die JSON-Bibliothek weitergegeben, die die Daten in ein JSON-Objekt parsen und durchlaufen wird, um die Albumtitel zu extrahieren und in der Konsole auszugeben.

Es ist wichtig zu beachten, dass du die MusicBrainz-API-Abfrage-URL an deine spezifischen Anforderungen anpassen musst, indem du die entsprechenden Parameter einfügst. Die genaue Syntax und die unterstützten Parameter findest du in der MusicBrainz-API-Dokumentation.

Quote
Ja, es ist auch möglich, die MusicBrainz-API in PowerBasic zu verwenden. Hier ist ein Beispielcode, der die Alben von Queen mit der MusicBrainz-ID "0383dadf-2a4e-4d10-a46a-e9e041da8eb3" abruft und die Albumtitel in der Konsole ausgibt:


#COMPILE EXE
#DIM ALL

#INCLUDE ONCE "WinHttpRequest.inc"

FUNCTION callback(BYREF data AS STRING, BYVAL size AS LONG, BYVAL userdata AS DWORD) AS LONG
    LOCAL json AS VARIANT
    LOCAL i AS LONG

    ' Daten als JSON-Objekt parsen
    JSONPARSE(data, VARTYPE(json), json)

    ' Durch jedes Release im JSON-Objekt iterieren und den Titel ausgeben
    FOR i = 0 TO JSONGETSIZE(json, "releases") - 1
        PRINT JSONGETSTRING(json, "releases", i, "title")
    NEXT i

    JSONFREE(json)
    FUNCTION = 0
END FUNCTION

FUNCTION PBMAIN() AS LONG
    LOCAL HttpReq AS WinHttpRequest
    LOCAL Url AS STRING

    ' MusicBrainz-API-Abfrage-URL mit Parametern
    Url = "https://musicbrainz.org/ws/2/release?artist=0383dadf-2a4e-4d10-a46a-e9e041da8eb3&fmt=json"

    ' HTTP-Anfrage senden und Antwort empfangen
    HttpReq.Initialize("PB MusicBrainz API")
    HttpReq.Open("GET", Url)
    HttpReq.SetRequestHeader("User-Agent", "PB MusicBrainz API")
    HttpReq.Send("")

    ' Antwortinhalt an den Callback-Handler übergeben
    HttpReq.WaitForResponse()
    HttpReq.ResponseText(callback, 0)

    FUNCTION = 0
END FUNCTION


In diesem Beispiel wird die WinHttpRequest-Bibliothek verwendet, um die API-Anfrage an die MusicBrainz-Server zu senden und die empfangene Antwort zu verarbeiten. Die empfangenen Daten werden an die JSON-Bibliothek weitergegeben, die die Daten in ein JSON-Objekt parsen und durchlaufen wird, um die Albumtitel zu extrahieren und in der Konsole auszugeben.

Es ist wichtig zu beachten, dass du die MusicBrainz-API-Abfrage-URL an deine spezifischen Anforderungen anpassen musst, indem du die entsprechenden Parameter einfügst. Die genaue Syntax und die unterstützten Parameter findest du in der MusicBrainz-API-Dokumentation.


Ja, hier ist eine Tabelle, die einige Vor- und Nachteile von MusicBrainz und Discogs vergleicht:

Das hier ist eine Tabelle, die kann ich hier aber nicht einfügen.

MusicBrainz                                                                        Discogs
Daten Umfangreiche und präzise Metadaten für Musik                Metadaten für Musik, aber auch für andere Medien

Community Große und engagierte Community von Freiwilligen Kommerzielle Community mit bezahlten Moderatoren
Lizenz         CC0 (public domain) für Daten, aber nicht für Bilder Proprietäre Lizenz für Daten und Bilder
API                 Umfangreiche und dokumentierte RESTful API         RESTful API mit begrenzten Funktionen
Dateneingabe Jeder kann Daten hinzufügen oder bearbeiten         Nur verifizierte Benutzer können Daten hinzufügen oder bearbeiten
Datenqualität Variabel, da jeder Benutzer Daten hinzufügen oder bearbeiten kann Konsistenter, da Daten von verifizierten Benutzern kommen
Integration Mehrere Musik-Player und Anwendungen unterstützen MusicBrainz als Metadatenquelle
                                                                                                       Weniger Unterstützung durch Drittanbieteranwendungen

Popularität         Weniger bekannt als Discogs, aber mit stetig wachsendem Nutzerkreis
                                                                                                       Beliebte Datenbank, aber auch mit begrenzten Metadaten für bestimmte Genres



Es ist jedoch wichtig zu beachten, dass diese Vor- und Nachteile auf den individuellen Gebrauch und die Bedürfnisse des Benutzers ankommen. Einige Benutzer bevorzugen möglicherweise die Community und das Verifizierungssystem von Discogs, während andere sich auf die umfangreichen Metadaten und die öffentliche Domäne von MusicBrainz konzentrieren.

Quelle: ChatGPT (https://chat.openai.com/chat)