view src/libaudtag/id3/id3v1.c @ 4887:0ddbd0025174 default tip

added libaudtag. (not used yet.)
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Wed, 05 May 2010 18:26:06 +0900
parents
children
line wrap: on
line source

/*
 * Copyright 2010 Tony Vroon
 *
 * This file is part of Audacious.
 *
 * Audacious is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, version 3 of the License.
 *
 * Audacious is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * Audacious. If not, see <http://www.gnu.org/licenses/>.
 *
 * The Audacious team does not consider modular code linking to Audacious or
 * using our public API to be a derived work.
 */

#include <glib.h>
#include <glib/gstdio.h>

#include "id3v1.h"
#include "../util.h"
#include <inttypes.h>
#include "../tag_module.h"
#include "../../audlegacy/strings.h"

static gboolean has_id3v1_ext;

gboolean id3v1_can_handle_file(VFSFile *f)
{
    gchar *tag = g_new0(gchar, 4);

    vfs_fseek(f, -355, SEEK_END);
    tag = read_char_data(f, 4);
    if (!strncmp(tag, "TAG+", 4))
        has_id3v1_ext = TRUE;
    else
        has_id3v1_ext = FALSE;

    vfs_fseek(f, -128, SEEK_END);
    tag = read_char_data(f, 3);
    if (!strncmp(tag, "TAG", 3))
    {
        g_free(tag);
        return TRUE;
    }

    g_free(tag);
    return FALSE;
}

static gchar *convert_to_utf8(gchar *str)
{
    return g_strchomp(str_to_utf8(str));
}

Tuple *id3v1_populate_tuple_from_file(Tuple *tuple, VFSFile *f)
{
    gchar *title = g_new0(gchar, 30);
    gchar *artist = g_new0(gchar, 30);
    gchar *album = g_new0(gchar, 30);
    gchar *year = g_new0(gchar, 4);
    gchar *comment = g_new0(gchar, 30);
    gchar *track = g_new0(gchar, 1);
    gchar *genre = g_new0(gchar, 1);
    gboolean genre_set = FALSE;
    vfs_fseek(f, -125, SEEK_END);
    title = read_char_data(f, 30);
    artist = read_char_data(f, 30);
    album = read_char_data(f, 30);
    year = read_char_data(f, 4);
    comment = read_char_data(f, 30);
    genre = read_char_data(f, 1);

    if (comment[28] == 0 && comment[29] != 0)
    {
        *track = comment[29];
    }

    title = convert_to_utf8(title);
    artist = convert_to_utf8(artist);
    album = convert_to_utf8(album);
    comment = convert_to_utf8(comment);

    if (has_id3v1_ext)
    {
        vfs_fseek(f, -351, SEEK_END);
        gchar *tmp_title = g_strconcat(title, convert_to_utf8(read_char_data(f, 60)), NULL);
        gchar *tmp_artist = g_strconcat(artist, convert_to_utf8(read_char_data(f, 60)), NULL);
        gchar *tmp_album = g_strconcat(album, convert_to_utf8(read_char_data(f, 60)), NULL);
        vfs_fseek(f, -170, SEEK_END);
        gchar *tmp_genre = g_new0(gchar, 30);
        tmp_genre = convert_to_utf8(read_char_data(f, 30));
        g_free(title);
        g_free(artist);
        g_free(album);
        title = tmp_title;
        artist = tmp_artist;
        album = tmp_album;

        if (g_strcmp0(tmp_genre, NULL) == 1)
        {
            tuple_associate_string(tuple, FIELD_GENRE, NULL, tmp_genre);
            genre_set = TRUE;
        }

        g_free(tmp_genre);
    }

    tuple_associate_string(tuple, FIELD_TITLE, NULL, title);
    tuple_associate_string(tuple, FIELD_ARTIST, NULL, artist);
    tuple_associate_string(tuple, FIELD_ALBUM, NULL, album);
    tuple_associate_int(tuple, FIELD_YEAR, NULL, atoi(year));
    tuple_associate_string(tuple, FIELD_COMMENT, NULL, comment);
    tuple_associate_int(tuple, FIELD_TRACK_NUMBER, NULL, *track);
    if (!genre_set) tuple_associate_string(tuple, FIELD_GENRE, NULL, convert_numericgenre_to_text(*genre));

    g_free(title);
    g_free(artist);
    g_free(album);
    g_free(year);
    g_free(comment);
    g_free(track);
    g_free(genre);
    return tuple;
}

gboolean id3v1_write_tuple_to_file(Tuple * tuple, VFSFile * f)
{
    return FALSE;
}