File m3u

di Anonimizzato13748 il
13 risposte
Salve avrei bisogno di aiuto per un programma che gestisca file m3u. Purtroppo non saprei dove iniziare....Il compito sarebbe quello di aprire un file m3u attraverso fopen()...dopodiche estrarre in ordine tutti i file mp3 che contiene (saltando quelli che inizinano con # e quelli non apribili o daneggiati).

13 Risposte

  • Ovvero cosa non riesci a fare? conosci il formato .m3u? hai le sue specifiche?
    Inizia a buttare giu del codice.
  • Con fopen() riesco ad aprire il file m3u.....il problema è isolare le string dei file mp3 al suo interno(evitando di estrarre file che iniziano con # o file mp3 che non si riescano ad aprire) inoltre grazie a le string dovrei essere in grado di aprire i file mp3 dal file m3u e isolare le info come artista,surata e ste cose qua.....il problema è appunto che non mi viene nulla quando provo a scrivere codice per isolare le strings dei file mp3 e ad aprire con esse i file mp3....
  • Il tutto in c.....
  • Cioè per dirla breve devo isolare i nomi dei file mp3 nella playlist(tranne quelli che iniziano per # o i file inesistenti o daneggiati) e salvarli per poterli elaborare successivamente....mi serve dunque una funzione per fare ciò
  • E il codice dov'é?
    Fammi vedere cosa stai facendo e dove sei bloccato.
    Postami anche il link da dove vedi le specifiche del formato.
    Questa é la base poi verranno gli aiuti.
  •   #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int file_size (char filename[255]){
      unsigned int file_size = 0;
      strip(filename);//gets the size of one file
      FILE* m3u_file = fopen(filename, "r");
    
      if (filename[0] == '#') {
        return 0;//ignore files with # on start
      }
    
      if (m3u_file == NULL) {
        return 0;  //ignore inexisting files
      }
    
      fseek(m3u_file, 0L, SEEK_END);
      file_size = ftell(m3u_file); //return the position of the reader in bytes
      fclose(m3u_file);
      return file_size; //go to EOF
    }
    
    int main(int argc, const char * argv[])
    {
      argv[1] = "playlist.m3u";
      FILE* m3u_file;
      m3u_file= fopen(argv[1], "r");
    
      if (m3u_file == NULL)
      {
        printf("Error: File %s not found.\n", argv[1]);
        return 2;
      }
    
    }
    
  • Manca il link sulle specifiche del file m3u è fondamentale!

    Non è buona norma modificare "argc" e "argv"
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAXPATH 256
    
    void fgets_wintoc(char *b)
    {
        int l = strlen(b);
        if ( b[l - 2] == '\r')
            b[l - 2] = '\0';
        else if ( b[l - 1] == '\n')
            b[l - 1] = '\0';
    }
    
    void m3u_parse(FILE* m3u,FILE* d)
    {
        printf("parsing file...\n");
    
        int line = 0;
        char buffer[MAXPATH];
        while ( fgets(buffer,MAXPATH,m3u) )
        {
            fgets_wintoc(buffer);
    
            ++line;
            if (buffer[0] == '#')
            {
                printf("\tskip line(%d) started with #\n",line);
            }
            else
            {
                FILE* test = fopen(buffer,"r");
                if ( test == NULL)
                {
                    printf("\tfile %s at line(%d) can't open\n",buffer,line);
                }
                else
                {
                    printf("\tadd file %s at line(%d)\n",buffer,line);
                    fclose(test);
                    fprintf(d,"%s\n",buffer);
                }
            }
        }
    
        printf("End parser");
    }
    
    int main(int argc, const char * argv[])
    {
        char listpath[MAXPATH];
        char m3upath[MAXPATH];
    
        puts(".M3U\n");
    
        if (argc == 1)
        {
            printf("Use default path:");
            strcpy(m3upath,"playlist.m3u");
            strcpy(listpath,"mylist.txt");
        }
        else
        {
            printf("Use param path:");
            strcpy(m3upath,argv[1]);
            if (argc == 2)
                strcpy(listpath,"mylist.txt");
            else
                strcpy(listpath,argv[2]);
        }
    
        printf("\n\tm3u:%s\n\tlst:%s\n\n",m3upath,listpath);
    
    
        printf("Open file:");
    
        FILE* dest = fopen(listpath, "w");;
        if ( dest == NULL)
        {
            printf("error destination file.\n");
            return -1;
        }
    
        FILE* m3u = fopen(m3upath, "r");
        if ( m3u == NULL)
        {
            fclose(dest);//cordiale
            printf("error m3u file.\n");
            return -1;
        }
    
        printf("ok\n");
    
        m3u_parse(m3u,dest);
    
        //cordiale
        fclose(m3u);
        fclose(dest);
    
        return 0;
    }
    
    Non so se funziona, l'ho scritto al volo,ma sicuramente con un pò di debug andrà.
  • Che intendi per specifiche del file m3u?
  • Quale è lo scopo di void fgets_wintoc(char *b) che usi?
  • erry00777 ha scritto:


    Che intendi per specifiche del file m3u?
    Ma che domanda fa?
    Sta dicendo che stai leggendo o scrivendo un file m3u senza sapere come questo file e' strutturato?
    Cosi' ... a capocchia?



    Come minimo dovresti conoscere a memoria questo:



    STUDIA
    - prima di scrivere anche solo una riga di codice!
    - anzi, prima di pensare di scrivere ...
    - anzi prima di decidere che devi pensare di scrivere ...
    - anzi, piu' in generale: PRIMA!!!!

  • Beh si che avevo dato un'occhiata alla struttura del mio file m3u...nel mio caso è una playlist d'esempio che mi viene fornita per poter effettuare alcuni tastcases scritta in plain text...aprendolo con un editor si ha :
    # comment line
    4.mp3
    5.mp3
    #another comment line
    6.mp3

    Il programma deve essere in grado di gestire file simili....
  • Quale è lo scopo di void fgets_wintoc(char *b) che usi?
    dato che non sapevo le specifiche allora quella funzione si assicura che alla fine del buffer non ci sia ne '\r' ne '\n'

    Ma va? veramente???? l'ho scritto sul notepad senza nemmeno compilare...
  • Grazie
Devi accedere o registrarti per scrivere nel forum
13 risposte