Gambas-it

Gambas3 => Programmazione => Topic aperto da: allegfede - 13 Febbraio 2014, 13:18:09

Titolo: [risolto] estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: allegfede - 13 Febbraio 2014, 13:18:09
In primis scusate la lunga assenza, ma sono stato (e ancora siamo piu' o meno nella stessa situazione) incasinatissimo ......
In secundis, Ciao :D

ora tornando in tema, cercando un po' in giro nel forum stavo provando ad individuare se qualche utente si fosse mai imbattuto nell'esigenza di estrarre i tag ID3 dai file audio, utilizzando gambas.

Ho trovato questa vecchia discussione: http://www.gambas-it.org/smf/index.php?topic=866.0 ed anche un modulo per Gambas2 postata dal buon Giulio .......
ed anche fsurfing aveva fatto qualcosa nel suo Gplay.

Pero' di primo acchitto il modulo da una serie di errori e per ora l'ho accantonato e Gplay non l'ho ancora chiesto a fsurfing ;-)

Qualche suggerimento?

Forse anche Gstreamer ha la possibilita' di estrarre le informazioni sui metadati, ma sono pigro e non ho voglia di mettere su tutto l'ambaradan di gstreamer, filtri, alberi etc :D

un saluto

Federico

Titolo: Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: vuott - 13 Febbraio 2014, 18:30:35
Oltre alla risorsa del componente gb.media che gestisce le risorse di GStreamer:
https://www.gambas-it.org/wiki/index.php/La_gestione_dell%27audio_e_dei_file_audio_mediante_il_componente_gb.media#Estrarre_i_Tag_da_un_file_audio

altre informazioni su alcuni tipi di file audio possono essere ricavate con le risorse del API di Sox:
http://www.gambas-it.org/wiki/index.php?title=Estrarre_informazioni_generali_da_un_file_audio_con_le_funzioni_esterne_del_API_di_Sox

Poi c'è il codice fsurfinghiano per gli mp3:
http://www.gambas-it.org/smf/index.php?topic=2450.msg26533#msg26533


....per tutto il resto c'è da studiare la struttura dei vari formati di file audio e le altre eventuali librerie !  :violent:
Titolo: Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: vuott - 14 Febbraio 2014, 16:23:05
...puoi utilizzare per gli MP3 anche le risorse della libreria libid3tag.
Ne ho fatto un riassunto/esempio nella nostra WIKI:
http://www.gambas-it.org/wiki/index.php?title=Estrarre_informazioni_da_un_file_MP3_con_le_funzioni_esterne_del_API_di_Id3tag
Titolo: Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: vuott - 18 Febbraio 2014, 13:12:23
...oppure usando le sole funzioni di Gambas anche in quest'altro modo (oltre quello di fsurfing):  :-X
Codice: gambas [Seleziona]

Public Sub Main()

  Dim percorsoFile, s, tag As String
  Dim ordo As New Integer[]
  Dim j, rm, k As Integer


   percorsoFile = "/percorso/del/file.mp3"
  
   s = File.Load(percorsoFile)
    
   Print "File audio mp3: '"; File.Name(percorsoFile); "'"
   Print "\nDimensione: "; Len(s); " byte"
  
   ordo.add(InStr(s, "TALB"))
    ordo.add(InStr(s, "TCOM"))
    ordo.add(InStr(s, "TCOP"))
    ordo.add(InStr(s, "TDAT"))
    ordo.add(InStr(s, "TDEN"))
    ordo.add(InStr(s, "TDLY"))
    ordo.add(InStr(s, "TDRC"))
    ordo.add(InStr(s, "TENC"))
    ordo.add(InStr(s, "TFLP"))
    ordo.add(InStr(s, "TIT1"))
    ordo.add(InStr(s, "TIT2"))
    ordo.add(InStr(s, "TIT3"))
    ordo.add(InStr(s, "TKEY"))
    ordo.add(InStr(s, "TLAN"))
    ordo.add(InStr(s, "TLEN"))
    ordo.add(InStr(s, "TMCL"))
    ordo.add(InStr(s, "TMED"))
    ordo.add(InStr(s, "TOAL"))
    ordo.add(InStr(s, "TOFN"))
    ordo.add(InStr(s, "TOLY"))
    ordo.add(InStr(s, "TOPE"))
    ordo.add(InStr(s, "TORY"))
    ordo.add(InStr(s, "TOWN"))
    ordo.add(InStr(s, "TPE1"))
    ordo.add(InStr(s, "TPE2"))
    ordo.add(InStr(s, "TPE3"))
    ordo.add(InStr(s, "TPE4"))
    ordo.add(InStr(s, "TPUB"))
    ordo.add(InStr(s, "TCON"))
    ordo.add(InStr(s, "TDRC"))
    ordo.add(InStr(s, "TRCK"))
    ordo.add(InStr(s, "TRDA"))
    ordo.add(InStr(s, "TRSN"))
    ordo.add(InStr(s, "TRSO"))
    ordo.add(InStr(s, "TSRC"))
    ordo.add(InStr(s, "TSSE"))
    ordo.add(InStr(s, "TYER"))
    ordo.add(InStr(s, "TXXX"))
    ordo.add(RInStr(s, "TXXX"))
    ordo.add(InStr(s, "COMM"))
    ordo.add(InStr(s, "PRIV"))
    ordo.add(RInStr(s, "PRIV"))
    ordo.add(RInStr(s, "WXXX"))
  

   While j < ordo.Count
     If ordo[j] = 0 Then
       ordo.Remove(j)
       Inc rm
       Dec j
     Endif
     Inc j
   Wend

   ordo.Sort()

   Print "\n  == T A G =="
    
   If ordo.Count > 0 Then    ' Se è presente almeno un TAG

     For j = 0 To ordo.Max

       k = ordo[j]

       While k < ordo[ordo.max] + 24
        
         If j < ordo.Max Then
' Verifica che il carattere ASCII sia una lettera o un numero oppure un segno di punteggiatura:
           If (k < ordo[j + 1]) And ((IsLetter(Mid(s, k, 1))) Or (IsDigit(Mid(s, k, 1))) Or (IsPunct(Mid(s, k, 1)))) Then
             tag &= Mid(s, k, 1)
           Else
             tag &= " "
           Endif
         Else
' Verifica che il carattere ASCII sia una lettera o un numero oppure un segno di punteggiatura:
           If ((IsLetter(Mid(s, k, 1))) Or (IsDigit(Mid(s, k, 1))) Or (IsPunct(Mid(s, k, 1)))) Then
             tag &= Mid(s, k, 1)
           Else
             tag &= " "
           Endif

         Endif
        
         Inc k
       Wend
      
       If (Left(tag, 4) <> "PRIV") And (InStr(tag, "PRIV") > 0) Then tag = Left(tag, InStr(tag, "PRIV") - 1)

       Print tag
       tag = Null
      
    Next
    
    Else
      Print "Assenti !"
    Endif

End
Titolo: Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: allegfede - 18 Febbraio 2014, 14:31:05
Interessante ....
Titolo: Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: vuott - 18 Febbraio 2014, 16:16:22
...ma, in fondo, i TAG nel file sono per lo più dati stringa, e quindi come tali vanno trattati.
Titolo: Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: allegfede - 18 Febbraio 2014, 17:59:35
Ho implementato il metodo usato in gplay e va abbastanza bene.
Ora provo a studiare se per gli ogg è lo stesso ...

http://www.xiph.org/vorbis/doc/v-comment.html
Titolo: Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: vuott - 18 Febbraio 2014, 18:04:47
Ora provo a studiare se per gli ogg è lo stesso ...

Il codice che ho inserito prima non va bene per i file formato .ogg, poiché le intestazioni (header) dei Tag, pur essendo ugulmente dati di tipo stringa, hanno un'identificazione testuale comunque diversa.
Titolo: Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: allegfede - 18 Febbraio 2014, 18:36:14
Ora provo a studiare se per gli ogg è lo stesso ...

Il codice che ho inserito prima non va bene per i file formato .ogg, poiché le intestazioni (header) dei Tag, pur essendo ugulmente dati di tipo stringa, hanno un'identificazione testuale comunque diversa.

negli ogg c'e' un "vettore di commenti" .... domani gli do' un occhio
Titolo: Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: vuott - 18 Febbraio 2014, 23:28:51
Interessante ....

Se poi, sempre con le sole funzioni di Gambas, vuoi conoscere TAG ed informazioni generali sul file .mp3, potresti anche provare un semplice codice come quello che ho riportato come breve esempio nella WIKI:  :-\

http://www.gambas-it.org/wiki/index.php?title=Estrarre_informazioni_e_TAG_da_un_file_MP3_con_le_sole_funzioni_di_Gambas
Titolo: Re: estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: vuott - 19 Febbraio 2014, 01:47:56
http://www.xiph.org/vorbis/doc/v-comment.html
negli ogg c'e' un "vettore di commenti"

Sì.... ma la pappa è sempre quella: dati stringa raggruppati... e quindi io opererei in modo analogo al formato mp3:  :-X
Codice: gambas [Seleziona]

Public Sub Main()

  Dim percorsoFile, s, tag As String
  Dim ordo As New Integer[]
  Dim j, rm, k As Integer
  Dim agg As Byte = 24



    percorsoFile = "/percorso/del/file.ogg"
  
    s = File.Load(percorsoFile)
    
' Verifica se effettivamente è un file .ogg:
    If Left(s, 4) <> "OggS" Then Error.Raise("Attenzione ! Il file caricato non è un file OGG !")
    
Print "File audio ogg: '"; File.Name(percorsoFile); "'"
Print "\nDimensione: "; Len(s); " byte"
  
    ordo.add(InStr(s, "TITLE="))
    ordo.add(InStr(s, "VERSION="))
    ordo.add(InStr(s, "ALBUM="))
    ordo.add(InStr(s, "TRACKNUMBER="))
    ordo.add(InStr(s, "ARTIST="))
    ordo.add(InStr(s, "PERFORMER="))
    ordo.add(InStr(s, "COPYRIGHT="))
    ordo.add(InStr(s, "LICENSE="))
    ordo.add(InStr(s, "ORGANIZATION="))
    ordo.add(InStr(s, "DESCRIPTION="))
    ordo.add(InStr(s, "GENRE="))
    ordo.add(InStr(s, "DATE="))
    ordo.add(InStr(s, "LOCATION="))
    ordo.add(InStr(s, "CONTACT="))
    ordo.add(InStr(s, "COMMENT="))
    ordo.add(InStr(s, "ISRC="))

    While j < ordo.Count
      If ordo[j] = 0 Then
        ordo.Remove(j)
        Inc rm
        Dec j
      Endif
      Inc j
    Wend

    ordo.Sort()
    
   Print "\n  == T A G =="

    If ordo.Count > 0 Then    ' Se è presente almeno un TAG

    If Mid(s, ordo[ordo.Max], 12) = "TRACKNUMBER=" Then agg = 15
    
    For j = 0 To ordo.Max

      k = ordo[j]

      While k < ordo[ordo.max] + agg
        
        If j < ordo.Max Then
' Verifica che il carattere ASCII sia una lettera o un numero oppure un segno di punteggiatura:
          If (k < ordo[j + 1]) And ((IsLetter(Mid(s, k, 1))) Or (IsDigit(Mid(s, k, 1))) Or (IsPunct(Mid(s, k, 1)))) Then
            tag &= Mid(s, k, 1)
          Else
            tag &= " "
          Endif
        Else
' Verifica che il carattere ASCII sia una lettera o un numero oppure un segno di punteggiatura:
          If ((IsLetter(Mid(s, k, 1))) Or (IsDigit(Mid(s, k, 1))) Or (IsPunct(Mid(s, k, 1)))) Then
            tag &= Mid(s, k, 1)
          Else
            tag &= " "
          Endif

        Endif
        
        Inc k

      Wend

      Print tag
      tag = Null
      
    Next
    
    Else
      Print "Assenti !"
  Endif

End


Se poi ci vuoi aggiungere anche un paio di ulteriori informazioni generali sul file:
http://www.gambas-it.org/wiki/index.php?title=Estrarre_informazioni_e_TAG_da_un_file_OggVorbis_con_le_sole_funzioni_di_Gambas
Titolo: Re: [risolto] estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: vuott - 08 Marzo 2014, 18:21:41
Per l'estrazione dei TAG e di altre informazioni generali dai file mp3 è possibile utilizzare anche le risorse esterne della libreria libavbin:
http://www.gambas-it.org/wiki/index.php?title=Estrarre_informazioni_e_TAG_da_un_file_MP3_con_le_funzioni_esterne_del_API_di_Avbin



Segnalo, ad ogni modo, anche quest'altre discussioni del forum:
http://www.gambas-it.org/smf/index.php?topic=77.0
http://www.gambas-it.org/smf/index.php?topic=866.0
http://www.gambas-it.org/smf/index.php?topic=2481.0
http://www.gambas-it.org/smf/index.php?topic=2450.0
Titolo: Re: [risolto] estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: vuott - 12 Marzo 2014, 12:59:38
Ci sarebbero anche le risorse della libreria libtagc:
http://www.gambas-it.org/wiki/index.php?title=Estrarre_informazioni_e_TAG_da_file_audio_con_le_funzioni_esterne_del_API_di_LibTagC
Titolo: Re: [risolto] estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: allegfede - 12 Marzo 2014, 20:04:04
vuott guarda che di librerie ce ne sono a tonnellate! che le vuoi listare tutte?   :P
Titolo: Re: [risolto] estrazione dei TAG ID3 dai brani MP3 (ma anche AAC o mp2 ..... )
Inserito da: vuott - 14 Marzo 2014, 14:10:43
...di librerie ce ne sono a tonnellate!
...infatti, se vuoi ottenere semplicemente i dati generali di un mp3, puoi anche utilizzare le risorse del API di Smpeg:   ;D
http://www.gambas-it.org/wiki/index.php?title=Estrarre_informazioni_da_un_file_MP3_con_le_funzioni_esterne_del_API_di_Smpeg



Più in generale segnalo nuovamente la sezione della nostra Wiki sulla gestione dell'audio in Gambas:

   https://www.gambas-it.org/wiki/index.php?title=Guide_della_comunit%C3%A0#Gestione_dei_dati_audio_e_dei_file_audio