[rešeno] [C] pomoč z knjižnico libid3tag, za branje mp3 "oznak" (tags)

Lepo pozdravljeni!

V C-ju sem se spravil delati program, ki bo urejal oznake (id3tags) mp3 datotek, s pomočjo knjižnice libid3tag.
Skupaj sem spravil samo naslednje, nato se mi pa je ustavilo!

struct id3_file *file;
struct id3_tag *tag;
struct id3_frame *frame;
union id3_field *field;

file = id3_file_open(\"/home/igor/Desktop/test.mp3\", ID3_FILE_MODE_READONLY);
tag = id3_file_tag(file);
frame = id3_tag_findframe(tag, ID3_FRAME_TITLE, 0);


se pravi odprem file test.mp3, preberem oznako(tag), ter poiščem prvi okvir: naslov skladbe(title frame). Struktura id3_frame je sestavljena iz char id[], char const *description, unsigned int nfields, union id3_field *fields. Se pravi moram pogledati fields, vendar ne znam razbiti union id3_field na "podrobnejše kose" (npr. frame->fields[0]->type ne deluje).

Pomagam si z kratkim "tutorial-om" http://www.mars.org/pipermail/mad-dev/2002-January/000439.html in
header file-om od knjižnice (id3tag.h).

Prosim, ne predlagajte mi drugih programskih jezikov, ker vem da bi lahko lažje naredil to v kakšnem drugem prog. jeziku, vendar si zelo želim to narediti v C-ju (samozadovoljstvo).

Prosim pomagajte mi!

Lp:Igor

Komentarji

  • napsy Član Ubuntu.si
    Imaš:

    union id3_field *fields; /* array of fields */
    Kakšenga tipa je fields, kakšnega tipa je *fields, kakšnega tipa je fields[0] ?
  • 1GOR Član
    uredil/-a 26. April, 2010
    napsy:
    Rabil sem vedeti kakšnega tipa je posamezno polje (field), in neka koda, ki sem jo našel na internetu me je zavedla
    (fields[0]- >type). V resnici s funkcijo id3_field_type(union id3_field *field) izveš kakšnega tipa je polje.
    Ampak vseeno hvala za pomoč!


    Rad bi samo povedal, da sem našel rešitev.
    Spisal sem dve funkciji, in sicer funkcijo za branje okvirja(frame)(get_frame), ter funkcjio za nastavljanje vrednosti okvirja(frame)(set_frame).

    Če bo slučajno komu prav prišlo!

    get_frame:

    /*Funkcija kot parameter prejme, tag(oznaka), ter frame_type(tip oznake ki jo hočemo prebrati)
    *Nekaj možnih tipov oznak:
    *ID3_FRAME_TITLE \"TIT2\"
    *ID3_FRAME_ARTIST \"TPE1\"
    *ID3_FRAME_ALBUM \"TALB\"
    *ID3_FRAME_YEAR \"TDRC\"
    *ID3_FRAME_TRACK \"TRCK\"
    *ID3_FRAME_GENRE \"TCON\"
    *ID3_FRAME_COMMENT \"COMM\"
    *
    *Funkcija vrne niz znakov, ki jih preberemo iz okvirja(frame)
    */
    char *get_frame(struct id3_tag *tag, const char *frame_type)
    {
    int i;
    struct id3_frame *frame;
    union id3_field *field;
    id3_latin1_t *text;


    frame = id3_tag_findframe(tag, frame_type, 0);

    if(frame == NULL)
    {

    return \"\";
    }

    for(i=0; i<frame->nfields; i++)
    {

    field = &frame->fields[i];

    if(id3_field_type(field) == ID3_FIELD_TYPE_STRINGLIST)
    {
    text = id3_ucs4_latin1duplicate(id3_field_getstrings(field, 0));
    }
    }

    return (char *)text;
    }

    set_frame

    /*Funkcija kot parameter prejme, tag(oznaka), frame_type(tip oznake ki jo hočemo prebrati),
    *data(vsebina, ki jo hočemo zapisati v frame) ter encoding(želeno kodiranje zankov)
    *Nekaj možnih kodiranj:
    *ID3_FIELD_TEXTENCODING_UTF_8
    *ID3_FIELD_TEXTENCODING_UTF_16
    *ID3_FIELD_TEXTENCODING_UTF_16BE
    *ID3_FIELD_TEXTENCODING_ISO_8859_1
    *
    *Funkcija vrne 0 če je bilo nastavljanje okvirja(frame) uspešno sicer vrne negativno število
    */
    int set_frame(struct id3_tag *tag, const char *frame_type, const char *data, enum id3_field_textencoding encoding)
    {
    struct id3_frame * frame;
    union id3_field *field;
    id3_ucs4_t *text;
    int err;

    while((frame = id3_tag_findframe(tag, frame_type, 0)))
    {
    id3_tag_detachframe(tag, frame);
    id3_frame_delete(frame);
    }

    if((data==NULL) || (strlen(data)==0))
    {
    return -1;
    }

    frame = id3_frame_new(frame_type);
    id3_tag_attachframe(tag, frame);

    field = id3_frame_field(frame, 0);
    id3_field_settextencoding(field, encoding);

    if((strcmp(frame_type, ID3_FRAME_COMMENT)==0 || (strcmp(frame_type, \"USLT\")==0)))
    {
    field = id3_frame_field(frame, 3);
    field->type = ID3_FIELD_TYPE_STRINGFULL;
    }
    else
    {
    field = id3_frame_field(frame, 1);
    field->type = ID3_FIELD_TYPE_STRINGLIST;
    }

    if(encoding == ID3_FIELD_TEXTENCODING_ISO_8859_1)
    {
    text = id3_latin1_ucs4duplicate((unsigned char *)data);
    }
    else
    {
    text = id3_utf8_ucs4duplicate((id3_utf8_t *)data);
    }

    if((strcmp(frame_type, ID3_FRAME_COMMENT)==0) || (strcmp(frame_type, \"USLT\")==0))
    {
    err = id3_field_setfullstring(field, text);
    }
    else
    {
    err = id3_field_setstrings(field, 1, &text);
    }

    free(text);

    if(err != 0)
    {
    return -2;
    }

    return 0;
    }

    še primer klicanja funkcije:

    #include<id3tag.h>
    ...
    struct id3_file *file;
    struct id3_tag *tag;
    char *artist;

    file = id3_file_open(\"datoteka.mp3\", ID3_FILE_MODE_READWRITE);
    tag = id3_file_tag(file);
    if(tag != NULL)
    {
    //set_frame
    set_frame(tag, ID3_FRAME_TITLE, \"Naslov skladbe\", ID3_FIELD_TEXTENCODING_UTF_16);
    //get_frame
    artist = get_frame(tag, ID3_FRAME_ARTIST);
    printf(\"Izvajalec: %s\n\",artist);
    }
    id3_file_update(file);
    id3_file_close(file);
    ...



    [SOLVED]
Za komentiranje se prijavite ali pa se vpišite.