Toon posts:

[java] zoekapplicatie met mp3

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

ik ben van plan om een applicatie te maken waarmee ik een basis map kan selecteren en dat de applicatie deze map samen met alle onderliggende mappen gaat doorzoeken en alle mp3's die ie tegenkomt gaat inlezen en daarvan de id3 tag in een hashset plaatst samen met de filename zodat ik ze kan sorteren op titel of artiest maar het voornaamste is dat ik erin kan zoeken...

de rede hiervan is dat ik de zoek functie in BPM Studio erg slecht vind. het is mogelijk om bpm een eigen webserver te laten draaien en door middel van het bezoeken van bepaalde url's op de locale bpm webserver kan bpm bestuurd worden. ik wil dus op die manier het gevonde mp3tje rechtstreeks in bmp laten laden in de playlist.

wat moet ik dus weten voordat ik kan beginnen

inlezen van bestanden (weet ik al)
uit de ingelezen string de id3 tag halen (zal met een stringTokenizer wel lukken)

doorzoeken van bestanden in verschillende submappen (hier weet ik niets vanaf)
openen van een url en het resultaat (er verschijnt een status op het scherm na het starten van een url) terug krijgen in java (is altijd een int of boolean)

heeft iemand een idee hoe ik het doorzoeken van de submappen aan moet pakken en hoe ik een url kan openen zonder de pagina op het scherm te zetten maar de inhoud (broncode) van de html pagina wel in java op te vangen?

  • nxt
  • Registratie: November 2001
  • Laatst online: 04-02 09:36

nxt

het meest simpele is waarschijnlijk recursie
dwz. je maakt een method (ik noem 'm maar ff leesDir(java.io.File)) die een instantie van java.io.File als parameter krijgt
die parameter representeerd de start directory
vervolgens roep je de listFiles method aan
dan krijg je een array terug met instanties van File (files en directories tenzij je een FileFilter gebruikt)

daarna iets van
als het een file is -> lees ID3 tag
als het een directory is roep de method leesDir nog een keer aan met als parameter de nieuwe directory


en voor het lezen van een html pagina van een webserver zonder dit te laten merken aan de gebruiker moet je even kijken naar de URLConnection class en de URL class (en bij de laatste met name de openConnection method)

p.s.
voor het inlezen van ID3V1 & ID3V2 zijn ook verschillende packages beschikbaar
maar als je het toch zelf wilt maken dan is ID3V1 wel het makkelijkste.

Verwijderd

Topicstarter
hallo,

het inlezen van de filenames is nu gelukt
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package UitlezenMap;

import java.io.*;
import java.util.*;

public class LeesMap {

public LinkedList geefLinbkedList(String path){
    return leesAlles(path);
  }

  private LinkedList leesAlles(String filepath) {
    int x = 0;

    LinkedList bestanden = new LinkedList();
    File[] lijstje = leesDir(filepath);

    for (int i = 0; i < lijstje.length; i++) {
      if (lijstje[i].isDirectory()) {
        File[] lijstje1 = leesDir(lijstje[i].getPath());

        for (int j = 0; j < lijstje1.length; j++) {
          if (lijstje1[j].isDirectory()) {
            File[] lijstje2 = leesDir(lijstje1[j].getPath());

            for (int k = 0; k < lijstje2.length; k++) {
              bestanden.add(lijstje2[k]);
            }
          }
          else {
            bestanden.add(lijstje1[j]);
          }
        }
      }
      else {
        bestanden.add(lijstje[i]);
      }
    }
    return bestanden;
  }

  private File[] leesDir(String filepath) {
    File[] lijstje;
    File file = new File(filepath);
    lijstje = file.listFiles();
    return lijstje;
  }

}


ik krijg nu een LinkedList terug met voor elk bestand het object ervan van de File klasse

nu wil ik het nog zo maken dat alleen de extensie mp3 in de LinkedList komt te staan. is hier een makkelijkere methode voor dan voor elke file te controleren met een tokenizer ofzo of het een bepaalde extense heeft

ik wil in mijn LinkedList namelijk alleem .mp3 en .wma

Verwijderd

Je code klopt niet helemaal, nou ja hij klopt wel, maar als ik nu bijvoorbeeld een file tree heb die 5 levels diep is dan komen niet alle bestanden in je linkedlist te staan. Je kunt beter gebruik maken van recursie om bestanden in een file tree te verzamelen. Volgens mij had de java tutorial een aantal voorbeelden mbt recursie mbt file trees, je moet maar eens daar kijken.

Kijk ook eens naar FileFilter deze kun je meegeven aan de constructor van File() en zo return deze alleen de files met extentie die je opgeeft in FileFilter. Als dat niet lukt kijk dan eens naar java.util.regexp (of iets dergelijks, ig regular expression)

Verwijderd

Als je in alle submappen van een map wil zoeken kan je wellicht dit gebruiken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void showDirContents (File f, Graphics gr)
{
   int i;
            
   if ((f.getPath()).endsWith (".wma") || (f.getPath()).endsWith(".mp3"))
  {
        ///Doe hier iet met die MP3 of WMA
   }
     
   if (f.isDirectory())
  {
         File []children = f.listFiles();
         for (i = 0; i < children.length; i++)
     showDirContents(children[i], gr);
 }
        
}


Waarbij ' File f' van een dan een string is die naar het door te zoeken path verwijst...

Ik weet niet of je er veel aan hebt. Je hebt in ieder geval recursie dus je kan alle submappen doorzoeken. de Endswith() filters op MP3 en WMA.

[ Voor 14% gewijzigd door Verwijderd op 23-12-2003 12:06 . Reden: layout nu weer goed.. ]


Verwijderd

Topicstarter
Verwijderd schreef op 23 december 2003 @ 12:03:
Als je in alle submappen van een map wil zoeken kan je wellicht dit gebruiken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void showDirContents (File f, Graphics gr)
{
   int i;
            
   if ((f.getPath()).endsWith (".wma") || (f.getPath()).endsWith(".mp3"))
  {
        ///Doe hier iet met die MP3 of WMA
   }
     
   if (f.isDirectory())
  {
         File []children = f.listFiles();
         for (i = 0; i < children.length; i++)
     showDirContents(children[i], gr);
 }
        
}


Waarbij ' File f' van een dan een string is die naar het door te zoeken path verwijst...

Ik weet niet of je er veel aan hebt. Je hebt in ieder geval recursie dus je kan alle submappen doorzoeken. de Endswith() filters op MP3 en WMA.
dit stukje code heeft me heel erg geholpen idd ik heb alleen het graphics gedeelte eruit gehaald dit heb ik niet nodig..

heb ik tot nu toe alleen nog een vraagje, de extensie is hoofdlettergevoelig, is dit nog op een netere manier op te lossen dan het if statement uit te breiden met alle mogelijkheden van hoofdletter en kleine letter kombinatie of is er een manier om java niet hoofdlettergevoelig te laten zoeken?

Verwijderd

Verwijderd schreef op 23 december 2003 @ 12:23:
[...]

heb ik tot nu toe alleen nog een vraagje, de extensie is hoofdlettergevoelig, is dit nog op een netere manier op te lossen dan het if statement uit te breiden met alle mogelijkheden van hoofdletter en kleine letter kombinatie of is er een manier om java niet hoofdlettergevoelig te laten zoeken?
Je zou even de documentatie van java.util.regex kunnen bekijken. Daarin zitten o.a. reguliere expressie waarmee je strings kan herkennen. Dat is eht enige wat je anders zou kunnen doen denk ik....

Verwijderd

Verwijderd schreef op 23 december 2003 @ 12:23:
[...]
heb ik tot nu toe alleen nog een vraagje, de extensie is hoofdlettergevoelig, is dit nog op een netere manier op te lossen dan het if statement uit te breiden met alle mogelijkheden van hoofdletter en kleine letter kombinatie of is er een manier om java niet hoofdlettergevoelig te laten zoeken?
Je kunt toch ook ff alles ToLower() doen :9

Verwijderd

Topicstarter
Verwijderd schreef op 23 december 2003 @ 12:48:
[...]


Je kunt toch ook ff alles ToLower() doen :9
ja idd dat werkt prima

bedankt nu kan ik voorlopig weer een eindje vooruit

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 09:36
Merk op dat recursie niet altijd ideaal is. Je kan ook overwegen om de te scannen directories bij te houden in een lijst ipv meteen te scannen (in pseudocode, ik ben geen java-kenner :)):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Scan (File BronDirectory)
{
  lijst->Clear ();
  lijst->Add (BronDirectory);

  while (!lijst->IsEmpty ())
  {
    ScanDirectory (lijst->Item (0));
    lijst->Delete (0);
  }
}


void ScanDirectory (File Dir)
{
  //alle files/directories van deze directory ophalen
  if (File.isDirectory ())
    lijst->Add (File);
  else
    //doe iets
}


Indien er veel subdirectories zijn is dit zeker te overwegen. Je kan ook ipv het eerste element uit de lijst de scannen het laatste scannen, dan doe je een diepte-eerst ipv een breedte-eerst.

De ID3 tag uitlezen is ook niet zo eenvoudig. Tenminste, de ID3v2tag niet.
maar voor Java bestaat er al een implementatie daarvoor: http://www.id3.org/implement.html

[ Voor 28% gewijzigd door schoene op 23-12-2003 13:44 ]


  • nxt
  • Registratie: November 2001
  • Laatst online: 04-02 09:36

nxt

Verwijderd schreef op 23 december 2003 @ 12:23:
[...]
dit stukje code heeft me heel erg geholpen idd ik heb alleen het graphics gedeelte eruit gehaald dit heb ik niet nodig..
je zou ook een filefilter kunnen gebruiken

code:
1
2
3
4
5
public class MyFileFilter extends java.io.FileFilter {
   public boolean accept(File f) { 
       return (f.isDirectory() || f.getName().toLowerCase().endsWith(".mp3"));
   }
}

en dan iets van

File[] files= eenFile.listFiles(new MyFileFilter());

dan krijg je alleen mp3 files + directories terug

Verwijderd

Topicstarter
Hallo,

het eruit halen van de mp3tjes en wma bestanden lukt nu maar ik krijg nog een fout bij het doorzoeken van een grote hoeveelheid data

als ik een gehele schijf van ongeveer 15 gb doorzoek met onderstaande code krijg ik een nullpointer op regel 24 en uiteraard dan ook op regel 25

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package UitlezenMap;

import java.io.*;
import java.util.*;

public class LeesMap {
  LinkedList bestanden = new LinkedList();

  public LinkedList geefLinkedList(String path) {
    File f = new File(path);
    showDirContents(f);
    return bestanden;
  }

  public void showDirContents(File f) {
    int i;
    if ( (f.getName()).toLowerCase().endsWith(".wma") ||
        (f.getName()).toLowerCase().endsWith(".mp3")) {
      this.bestanden.add(f);
    }

    if (f.isDirectory()) {
      File[] children = f.listFiles();
      System.out.println(children.length);
      for (i = 0; i < children.length; i++)
        showDirContents(children[i]);

    }
  }

  /* private LinkedList leesAlles(String filepath) {
     LinkedList bestanden = new LinkedList();
     File[] lijstje = leesDir(filepath);
     for (int i = 0; i < lijstje.length; i++) {
       if (lijstje[i].isDirectory()) {
         File[] lijstje1 = leesDir(lijstje[i].getPath());
         for (int j = 0; j < lijstje1.length; j++) {
           if (lijstje1[j].isDirectory()) {
             File[] lijstje2 = leesDir(lijstje1[j].getPath());
             for (int k = 0; k < lijstje2.length; k++) {
               bestanden.add(lijstje2[k]);
             }
           }
           else {
             bestanden.add(lijstje1[j]);
           }
         }
       }
       else {
         bestanden.add(lijstje[i]);
       }
     }
     return bestanden;
   }
   */
  private File[] leesDir(String filepath) {
    File[] lijstje;
    File file = new File(filepath);
    lijstje = file.listFiles();
    return lijstje;
  }

}


heeft iemand een idee hoe ik dit op kan lossen

als ik namelijk een map doorzoek met enorm veel submappen maar met een hoeveelheid data van ongeveer 6 gb gaat het prima.

Verwijderd

Topicstarter
Hallo,

na wat zoekwerk en overleg met mede studenten denk ik dat het te maken heeft met de stack- of de heap- size (de plaats waar de variabelen opgeslagen worden

waarschijnlijk is deze te klein om de recursieve methode uit te voeren

hij geeft een nullpointer zoals hierboven beschreven...

heeft iemand een id om deze ruimte te verhogen of om de methode efficienter te maken waardoor dit niet meer nodig is.
ik moet namelijk een schijf van 180 gb kunnen scannen in mijn applicatie...

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 09:36
Indien je alle posts in deze thread zou gelezen hebben zou je al moeten weten dat ik je er voor gewaarschuwd heb. Een oplossing is er ook te zien.

  • mr.inno
  • Registratie: April 2003
  • Laatst online: 22-02 15:03
Verwijderd schreef op 24 december 2003 @ 00:35:
Hallo,

na wat zoekwerk en overleg met mede studenten denk ik dat het te maken heeft met de stack- of de heap- size (de plaats waar de variabelen opgeslagen worden

waarschijnlijk is deze te klein om de recursieve methode uit te voeren

hij geeft een nullpointer zoals hierboven beschreven...

heeft iemand een id om deze ruimte te verhogen of om de methode efficienter te maken waardoor dit niet meer nodig is.
ik moet namelijk een schijf van 180 gb kunnen scannen in mijn applicatie...
heb je nou 180 gig aan sound.. of kun je niet ordennen ;)
maar uhmm. dit is een goed idde dit progsel.. zeok namelijk zo iets dat in windows werkt

inno


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:03
mr.inno schreef op 25 december 2003 @ 13:13:
maar uhmm. dit is een goed idde dit progsel.. zeok namelijk zo iets dat in windows werkt
Volgens mij is dit exact wat de Media Library van de Media Player die standaard bij een beetje recent Windows installatie zit doet. Volgens mij heeft die nieuwe Winamp (3 of 5 of hoe heet dat tegenwoordig) trouwens ook zoiets.

  • mr.inno
  • Registratie: April 2003
  • Laatst online: 22-02 15:03
Soultaker schreef op 25 december 2003 @ 13:42:
[...]

Volgens mij is dit exact wat de Media Library van de Media Player die standaard bij een beetje recent Windows installatie zit doet. Volgens mij heeft die nieuwe Winamp (3 of 5 of hoe heet dat tegenwoordig) trouwens ook zoiets.
hmm dan had ik het fout begrepen.. ik dacht dat dit een bestand zou outputten

inno


Verwijderd

Topicstarter
mr.inno schreef op 25 december 2003 @ 14:02:
[...]

hmm dan had ik het fout begrepen.. ik dacht dat dit een bestand zou outputten
de bedoeling is dat het gevonden bestand toegevoegd kan worden aan de current playlist van bpm studio en eventueel direct gestart kan worden in de vrije player

en nee ik heb nu nog geen 180 gb aan sound maar de applicatie moet dit in de toekomst wel aan kunnen

[ Voor 13% gewijzigd door Verwijderd op 27-12-2003 11:01 ]

Pagina: 1