Aktuelle Zeit: 04.06.2020 19:45

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: Ganzzahlen ordnen
BeitragVerfasst: 20.01.2020 18:15 
Offline
Benutzeravatar

Registriert: 11.10.2005 15:46
Ui, ja das ist schon etwas komplizierter! ;)

Zitat:
gäbe noch ein Problem, wenn am Ende des Templates was anderes als ein Buchstabe steht


Das gleiche Problem habe ich auch mit meinem Code gehabt. Aber ich werd mir mal den Code von PureLust einverleiben und daran etwas basteln. Wobei ich immer dankbar für weitere (weniger komplizierte) Vorschläge bin. ;)

_________________
PureBasic 5.71 | Windows 10 pro (x64)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ganzzahlen ordnen
BeitragVerfasst: 20.01.2020 18:32 
Offline
Benutzeravatar

Registriert: 21.07.2005 00:02
Wohnort: am schönen Niederrhein
Zerosurf hat geschrieben:
Der Code soll bewirken, ...
Ah ok ... ich nehme an, dass Du dann also Dein Projekt von 2015 fortsetzen möchtest?

Wie Du vielleicht weißt, sind normalerweise genau diese Informationen, die Du aus den Dateinamen auslesen möchtest (also Artist, Title, Disc, TrackNr.,...), auch in der MP3 Datei selber nochmals gespeichert - in sogenannten <ID3-Tags>.

Hierzu hatte Dir ts-soft damals schon mal einen Beitrag mit der idealen Lösung verlinkt.
Und zwar hatte er hier eine Routine vorgestellt, die Dir aus einer MP3-Datei genau diese Informationen heraus sucht.

Du warst damals nicht darauf eingegangen ... vielleicht weil Dir das etwas zu kompliziert erschien?

Es wäre meiner Meinung aber definitiv die beste und 'sicherste' Lösung, da Du Dich nicht mit verschiedenen Varianten von Dateinamen herum schlagen musst und unter Umständen auch Dateinamen dabei sind, die nicht korrekt aufgelöst werden können.

Versuch doch mal, ob Du den Code von ts-soft so einigermaßen verstehen kannst und wenn Du dann Fragen hast, können wir Dir da bestimmt noch weiter helfen.

Grüße, PL.

_________________
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)


Zuletzt geändert von PureLust am 20.01.2020 18:37, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ganzzahlen ordnen
BeitragVerfasst: 20.01.2020 18:37 
Offline
Benutzeravatar

Registriert: 11.10.2005 15:46
Leider gibt es da keine mp3 Tags und genau deswegen versuche ich es erneut - aber ich komm schon weiter - bin grad noch am tüfteln! ;)

_________________
PureBasic 5.71 | Windows 10 pro (x64)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ganzzahlen ordnen
BeitragVerfasst: 20.01.2020 18:40 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Ohne dir jetzt den Spaß am Programmieren nehmen zu wollen, aber genau für diese Sache nutze ich EasyTAG. Das gibt es für Linux und Windows und ich habe damit meine gesamte MP3-Sammlung gesäubert. Es kann Daten aus Dateinamen und MP3-Tags lesen und schreiben und austauschen. Es unterstützt außerdem noch viele andere Musikformate und hat noch einige weitere Extrafeatures.

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ganzzahlen ordnen
BeitragVerfasst: 20.01.2020 18:46 
Offline
Benutzeravatar

Registriert: 11.10.2005 15:46
NicTheQuick hat geschrieben:
Ohne dir jetzt den Spaß am Programmieren nehmen zu wollen, aber genau für diese Sache nutze ich EasyTAG. Das gibt es für Linux und Windows und ich habe damit meine gesamte MP3-Sammlung gesäubert. Es kann Daten aus Dateinamen und MP3-Tags lesen und schreiben und austauschen. Es unterstützt außerdem noch viele andere Musikformate und hat noch einige weitere Extrafeatures.


Vielen Dank, aber ich möchte keine mp3 taggen - sondern sie in eine Sqlite - Datenbank mit Hilfe eines Templates einfügen! ;)

_________________
PureBasic 5.71 | Windows 10 pro (x64)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ganzzahlen ordnen
BeitragVerfasst: 20.01.2020 18:52 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Richtig. Und wenn die Dateien einmal ordentlich getaggt sind, dann ist das ein Kinderspiel. Ohne MP3-Tags zeigt dir ein Player ja auch immer nur sowas wie "Unbekannter Künstler - Track 01" oder ähnliches an. Mit MP3-Tags hättest du beide Probleme gelöst. Aber gut, ich weiß auch zu wenig über dein Backend.

Probleme machen beim Windows-Dateisystem ja dann auch noch einige Sonderzeichen, die nicht gespeichert werden können. Zum Beispiel kann man keine Fragezeichen nutzen, auch keine Doppelpunkte oder Schrägstriche. In den Tags kann man diese Informationen aber problemlos speichern. Unter Linux ist es nicht ganz so wild, da ist nur / nicht erlaubt, alles andere geht. Und im Notfall kann man einfach den Division Slash nutzen. :D

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ganzzahlen ordnen
BeitragVerfasst: 20.01.2020 20:39 
Offline
Benutzeravatar

Registriert: 11.10.2005 15:46
Habs endlich geschafft:

Code:
Template$ = "D-N - A - T"
Filename$ = "SF390-01 - Freya Ridings - Lost Without You"

Structure MyWerte
  Name.s
  Wert.l
EndStructure

PositionA = FindString(Template$, "A")
PositionT = FindString(Template$, "D")
PositionD = FindString(Template$, "N")
PositionN = FindString(Template$, "T")

NewList MyList.MyWerte()
AddElement(MyList())
MyList()\Name = "A"
MyList()\Wert = PositionA
AddElement(MyList())
MyList()\Name = "D"
MyList()\Wert = PositionT
AddElement(MyList())
MyList()\Name = "N"
MyList()\Wert = PositionD
AddElement(MyList())
MyList()\Name = "T"
MyList()\Wert = PositionN

SortStructuredList(MyList(), #PB_Sort_Ascending, OffsetOf(MyWerte\Wert), #PB_Long)

ForEach MyList()
  MyList()\Wert = ListIndex(MyList())
Next

SortStructuredList(MyList(), #PB_Sort_Ascending, OffsetOf(MyWerte\Name), #PB_String)

SelectElement(MyList(), 0)
Artist$ = Trim(StringField(Filename$, MyList()\Wert + 1, "-"))
SelectElement(MyList(), 1)
DiscID$ = Trim(StringField(Filename$, MyList()\Wert + 1, "-"))
SelectElement(MyList(), 2)
TrackNr$ = Trim(StringField(Filename$, MyList()\Wert + 1, "-"))
SelectElement(MyList(), 3)
Title$ = Trim(StringField(Filename$, MyList()\Wert + 1, "-"))

Debug "Artist: " + Artist$
Debug "Title: " + Title$
Debug "DiscID: " + DiscID$
Debug "TrackNr: " + TrackNr$


Vielen Dank an alle die mir geholfen haben!
:)

_________________
PureBasic 5.71 | Windows 10 pro (x64)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ganzzahlen ordnen
BeitragVerfasst: 20.01.2020 20:40 
Offline
Benutzeravatar

Registriert: 21.07.2005 00:02
Wohnort: am schönen Niederrhein
Wie Nic schon sagte, ... MP3-Tags haben diverse Vorteile ... deswegen hat man sie ja erfunden. ;)

Aber da Du ja sagtest dass Du die nicht nutzen willst und ich da irgendwie Bock drauf hatte, hab ich mal meinen Senf dazu in die Tastatur geprügelt. :mrgreen:

Code:
EnableExplicit

Enumeration
   #Separator
   #_Artist
   #_Title
   #_Disk
   #_Track
EndEnumeration

Structure Parse
   Type.l
   Separator.s
EndStructure

Structure MP3Info            ; Structure mit MP3-Infos
   Filename.s
   Artist.s
   Title.s
   DiskID.s
   TrackNr.s
EndStructure

Procedure GetSongInfo(FileName$, Mask$, *Song.MP3Info)
   
   Static NewList Parse.Parse()        ; ---- Liste, um die Infos aus dem Dateinamen heraus zu filtern ----
   Static LastMask$
   Protected n, m, c$, max
   Protected MaskEND.s = "{*eNd*}"                                                              ; Um das Ende zu definieren, wird eine End-Token generiert
   Protected AktFilename$ = GetFilePart(Filename$, #PB_FileSystem_NoExtension) + MaskEND        ; Das End-Token wird an den zu parsenden Dateinamen angefügt
   Mask$ + "[" + MaskEND + "]"                                                                  ; Das End-Token wird an die zu verarbeitende Maske angefügt
   max = Len(Mask$)                                                                             ; Länge der Maske zwischenspeichern
   ClearStructure(*Song, MP3Info)                                                               ; die übergebene Struktur muss geleert werden, sonnst könnten Reste von zuvor übrig bleiben
   
   ; ------------  parse Mask$, but only if Mask$ is not already parsed  ----------------------
   
   If Mask$ <> LastMask$
      
      LastMask$ = Mask$
      
      ClearList(Parse())                                   ; neue Maske - also Liste der zu parsenden Elemente Löschen
      With Parse()                                         ; 'With' benutzen, um Schreibweise für strukturierte Variablen zu verkürzen.  Statt Parse()\Separator und Parse()\Type kann nun also \Separator und \Type geschrieben werden
         
         For n = 1 To max                                  ; die Maske vom ersten bis zum letzten Zeichen durchgehen
            
            c$ = Mid(Mask$,n,1)                            ; aktuelles Zeichen der Maske verarbeiten
            
            If c$ = "["                                    ; Wenn aktuelles Zeichen = '[', dann 'Separator' erkannt
               
               For m = n+1 To max                                  ; End-Zeichen für Separator suchen
                  
                  If Mid(Mask$,m,1) = "]"                          ; End-Zeichen gefunden
                     Break                                         ; Erkennung des Separators abschließen
                  Else
                     \Separator + Mid(Mask$,m,1)                   ; aktuelles Zeichen dem Separator hinzufügen  -  der komplette Separator befindet sich also nachher  Parse()\Separator
                  EndIf
               Next
               
               n = m                                               ; Zeiger für das nächstes Zeichen auf die Position nach dem erkannten Separator setzen
               
            Else                                            ; Kein Separator - also prüfen welches Datenfeld hier ausgewertet werden soll
               
               AddElement(Parse())                                 ; neuen Element zur Parser-Liste hinzufügen
               
               Select UCase(c$)
                     
                  Case "A"  :  \Type = #_Artist                    ; Typ des Datenfeldes auswerten und in  Parse()\Type  speichern
                  Case "D"  :  \Type = #_Disk
                  Case "N"  :  \Type = #_Track
                  Case "T"  :  \Type = #_Title
                     
               EndSelect
               
            EndIf
            
         Next                                               ; Fertig, nachdem alle Zeichen der Maske ausgewertet sind
         
         ; ForEach parse() :  Debug "Type: " + \Type + "   -   " + \Separator : Next
         
      EndWith
   EndIf
   
   ; -------------------  parse FileName$  ------------------------
   
   With *Song                                                 ; 'With' benutzen, um Schreibweise für strukturierte Variablen zu vereinfachen   -   *Song ist die übergebene Variable: SongInfo  die als @SongInfo übergeben wurde
      
      \Filename = Filename$                                   ; Name der datei in die Struktur der Rückgabevariable schreiben
      
      n = 1                                                   ; setzt die Suchposition auf das erste Zeichen
      
      ForEach Parse()                                                ; Alle zuvor gefundenen Separatoren der Maske abarbeiten - Einen nach dem Anderen
         
         m = FindString(AktFilename$, Parse()\Separator, n)          ; Position des aktuellen Separators heraus finden
         
         If m > 0                                                    ; Wenn Separator gefunden ...
            
            c$ = Mid(AktFilename$, n, m-n)                                 ; Text von aktueller Suchposition bis zum Separator ausschneiden
            
            Select Parse()\Type
                  
               Case #_Artist  : \Artist  = c$                              ; prüfen für welchen DatenTyp dieser Separator war und ausgeschnittenen Text dann in dieses Feld schreiben
               Case #_Disk    : \DiskID  = c$
               Case #_Track   : \TrackNr = c$
               Case #_Title   : \Title   = c$
                  
            EndSelect
            
            n = m + Len(Parse()\Separator)                                 ; neue Suchposition auf Zeichen HINTER dem gefunden Separator setzen
            
         EndIf
         
      Next                                                           ; wenn alle Separatoren abgearbeitet, dann feddisch ...
      
      ; Debug "Filename: " + \Filename + "    -  Artist: " + \Artist + "  -  Title: " + \Title + "  -  Disk/Track: " + \DiskID + "\" + \TrackNr
      
   EndWith
   
EndProcedure



Define SongInfo.MP3Info       ; ----- für MP3Infos strukturierte Variable - dienst für Rückgabewerte aus GetSongInfo()

Define Template$ = "D[-]N[ - ]A[ - ]T"
Define Filename$ = "SF390-01 - Freya Ridings - Lost Without You.mp3"

GetSongInfo(FileName$, Template$, @SongInfo)         ; --- FileName und Maske übergeben - Ergebnis wird in die struktorierte Variable SongInfo geschrieben

Debug "Filename: " + SongInfo\Filename + "    -  Artist: " + SongInfo\Artist + "  -  Title: " + SongInfo\Title + "  -  Disk\Track: " + SongInfo\DiskID + "\" + SongInfo\TrackNr + #CRLF$

; ---

With SongInfo            ; benutze 'With' für kürzere Schreibweise . . .
   
   GetSongInfo("DS4120-12 - Harold Faltermeyer - Axel F..mp3",  Template$,   @SongInfo)
   
   Debug "Filename: " + \Filename + "    -  Artist: " + \Artist + "  -  Title: " + \Title + "  -  Disk\Track: " + \DiskID + "\" + \TrackNr + #CRLF$
   
   ; ---
   
   Template$ = "A[-]T[ - Disk:]D[ - Track:]N"      ;  -----    ein anderes Template / Maske definieren, für Dateinamen, die anders aufgebaut sind  --------
   
   GetSongInfo("yello - The Race - Disk:01 - Track:03.mp3",  Template$,   @SongInfo)
   
   Debug "Filename: " + \Filename + "    -  Artist: " + \Artist + "  -  Title: " + \Title + "  -  Disk\Track: " + \DiskID + "\" + \TrackNr + #CRLF$
   
   
EndWith

End

Ich hab das allerdings so gemacht, dass bei der Maske (Template$), der 'Separator' in eckige Klammern gefasst werden muss (also z.B. [ - ]).

Falls Du's noch gebrauchen kannst ... viel Spaß beim reinschauen. :D

_________________
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)


Zuletzt geändert von PureLust am 20.01.2020 21:38, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ganzzahlen ordnen
BeitragVerfasst: 20.01.2020 20:50 
Offline
Benutzeravatar

Registriert: 21.07.2005 00:02
Wohnort: am schönen Niederrhein
Zerosurf hat geschrieben:
Habs endlich geschafft:
Sieht gut aus. :allright:

Kleiner Schönheitsfehler:
Du nutzt nicht wirklich die komplette Größe der Separatoren (also statt ' - ' nutzt Du nur '-') und der Separator muss immer ein Minuszeichen sein.
Wie Kiffi damals schon geschrieben hatte, treten dann bei Interpreten oder Songtexten mit '-' Probleme auf.

Bspl:
Code:
Filename$ = "SF390-01 - a-ha - Take On Me"       ; <=  problematisch

_________________
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ganzzahlen ordnen
BeitragVerfasst: 20.01.2020 21:12 
Offline
Benutzeravatar

Registriert: 11.10.2005 15:46
Hey Wahnsinn - vielen Dank - muss mal deinen Code studieren!

Bzgl Separator - ja, ich weiß, aber manche Karaoketitel haben manchmal Separatoren nur so " - " und manche auch ohne Space, also "-" - da muss ich dann einen Kompromiss machen oder eine Abfrage, wieviele "-" im String vorhanden sind und dem entsprechend eine Abfrage schreiben. ;)

_________________
PureBasic 5.71 | Windows 10 pro (x64)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye