Пример #1
0
void remove_tag(const char* file_name)
{
    FILE* file;
    FILE* temp_file;
    ID3v2_header* tag_header;

    file = fopen(file_name, "r+b");
    temp_file = tmpfile();

    tag_header = get_tag_header(file_name);
    if(tag_header == NULL)
    {
        return;
    }

    fseek(file, tag_header->tag_size + 10, SEEK_SET);
    int c;
    while((c = getc(file)) != EOF)
    {
        putc(c, temp_file);
    }

    // Write temp file data back to original file
    fseek(temp_file, 0, SEEK_SET);
    fseek(file, 0, SEEK_SET);
    while((c = getc(temp_file)) != EOF)
    {
        putc(c, file);
    }
}
Пример #2
0
ID3v2_tag* load_tag(const char* file_name)
{
    // Declaration
    FILE* file;
    ID3v2_tag* tag;
    ID3v2_frame_list* frame_list;
    ID3v2_header* tag_header;
    
    // Initialization
    tag = new_tag();
    tag_header = get_tag_header(file_name);
    
    if(tag_header == NULL || 
       get_tag_version(tag_header) == NO_COMPATIBLE_TAG)
    {
        // No compatible ID3 tag in the file, or we got some problem opening the file
        free_tag(tag);
        return NULL;
    }
    
    // Associations
    tag->tag_header = tag_header;
    file = fopen(file_name, "rb");
    if(file == NULL)
    {
        perror("Error opening file");
        free_tag(tag);
        return NULL;
    }
    
    tag->raw = (char*) malloc(tag->tag_header->tag_size * sizeof(char));
    fseek(file, 10, SEEK_SET);
    fread(tag->raw, tag->tag_header->tag_size, 1, file);
    fclose(file);
    
    int offset = 0;
    while(offset < tag->tag_header->tag_size)
    {
        ID3v2_frame* frame;
        frame = parse_frame(tag->raw, offset, get_tag_version(tag_header));

        if(frame != NULL)
        {
            offset += frame->size + 10;
            add_to_list(tag->frames, frame);
        }
        else
        {
            break;
        }
    }
    
    return tag;
}