File contents
diff -Nru mp3fs-0.12.orig/src/Makefile.am mp3fs-0.12/src/Makefile.am
--- mp3fs-0.12.orig/src/Makefile.am 2007-11-15 14:34:32.000000000 +0900
+++ mp3fs-0.12/src/Makefile.am 2008-04-17 01:40:14.000000000 +0900
@@ -1,4 +1,4 @@
bin_PROGRAMS = mp3fs
-mp3fs_SOURCES = mp3fs.c transcode.c transcode.h class.c class.h stringio.c stringio.h talloc.c talloc.h
+mp3fs_SOURCES = mp3fs.c transcode.c transcode.h class.c class.h stringio.c stringio.h talloc.c talloc.h id3.cpp
mp3fs_CFLAGS = $(fuse_CFLAGS) $(id3tag_CFLAGS)
-mp3fs_LDFLAGS = -lFLAC -logg -lmp3lame $(fuse_LIBS) $(id3tag_LIBS)
+mp3fs_LDFLAGS = -lFLAC -logg -lmp3lame -lid3 $(fuse_LIBS) $(id3tag_LIBS)
diff -Nru mp3fs-0.12.orig/src/Makefile.in mp3fs-0.12/src/Makefile.in
--- mp3fs-0.12.orig/src/Makefile.in 2008-03-09 16:30:47.000000000 +0900
+++ mp3fs-0.12/src/Makefile.in 2008-04-17 01:40:14.000000000 +0900
@@ -50,7 +50,7 @@
PROGRAMS = $(bin_PROGRAMS)
am_mp3fs_OBJECTS = mp3fs-mp3fs.$(OBJEXT) mp3fs-transcode.$(OBJEXT) \
mp3fs-class.$(OBJEXT) mp3fs-stringio.$(OBJEXT) \
- mp3fs-talloc.$(OBJEXT)
+ mp3fs-talloc.$(OBJEXT) id3.$(OBJEXT)
mp3fs_OBJECTS = $(am_mp3fs_OBJECTS)
mp3fs_LDADD = $(LDADD)
DEFAULT_INCLUDES = -I. -I$(srcdir)
@@ -64,6 +64,14 @@
CCLD = $(CC)
LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
SOURCES = $(mp3fs_SOURCES)
DIST_SOURCES = $(mp3fs_SOURCES)
ETAGS = etags
@@ -176,13 +184,13 @@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
-mp3fs_SOURCES = mp3fs.c transcode.c transcode.h class.c class.h stringio.c stringio.h talloc.c talloc.h
+mp3fs_SOURCES = mp3fs.c transcode.c transcode.h class.c class.h stringio.c stringio.h talloc.c talloc.h id3.cpp
mp3fs_CFLAGS = $(fuse_CFLAGS) $(id3tag_CFLAGS)
-mp3fs_LDFLAGS = -lFLAC -logg -lmp3lame $(fuse_LIBS) $(id3tag_LIBS)
+mp3fs_LDFLAGS = -lFLAC -logg -lmp3lame -lid3 $(fuse_LIBS) $(id3tag_LIBS)
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .cpp .lo .o .obj
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -242,7 +250,7 @@
done
mp3fs$(EXEEXT): $(mp3fs_OBJECTS) $(mp3fs_DEPENDENCIES)
@rm -f mp3fs$(EXEEXT)
- $(LINK) $(mp3fs_LDFLAGS) $(mp3fs_OBJECTS) $(mp3fs_LDADD) $(LIBS)
+ $(CXXLINK) $(mp3fs_LDFLAGS) $(mp3fs_OBJECTS) $(mp3fs_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -250,6 +258,7 @@
distclean-compile:
-rm -f *.tab.c
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/id3.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mp3fs-class.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mp3fs-mp3fs.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mp3fs-stringio.Po@am__quote@
@@ -347,6 +356,27 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mp3fs_CFLAGS) $(CFLAGS) -c -o mp3fs-talloc.obj `if test -f 'talloc.c'; then $(CYGPATH_W) 'talloc.c'; else $(CYGPATH_W) '$(srcdir)/talloc.c'; fi`
+.cpp.o:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
mostlyclean-libtool:
-rm -f *.lo
diff -Nru mp3fs-0.12.orig/src/id3.cpp mp3fs-0.12/src/id3.cpp
--- mp3fs-0.12.orig/src/id3.cpp 1970-01-01 09:00:00.000000000 +0900
+++ mp3fs-0.12/src/id3.cpp 2008-04-19 17:59:16.000000000 +0900
@@ -0,0 +1,106 @@
+#include <id3/tag.h>
+#include <id3tag.h>
+
+static const char *id3tag_frame_ids[] =
+{
+ ID3_FRAME_TITLE,
+ ID3_FRAME_ARTIST,
+ ID3_FRAME_ALBUM,
+ ID3_FRAME_TRACK,
+ ID3_FRAME_YEAR,
+ ID3_FRAME_GENRE,
+ ID3_FRAME_COMMENT,
+ NULL,
+};
+
+static const ID3_FrameID id3lib_frame_ids[] =
+{
+ ID3FID_TITLE,
+ ID3FID_LEADARTIST,
+ ID3FID_ALBUM,
+ ID3FID_TRACKNUM,
+ ID3FID_YEAR,
+ ID3FID_CONTENTTYPE,
+ ID3FID_COMMENT,
+};
+
+const char *get_field_rawstring(const id3_ucs4_t *str, id3_field_textencoding encoding)
+{
+ if (encoding == ID3_FIELD_TEXTENCODING_UTF_16 ||
+ encoding == ID3_FIELD_TEXTENCODING_UTF_16BE)
+ return reinterpret_cast<const char *>(id3_ucs4_utf16duplicate(str));
+ else if (encoding == ID3_FIELD_TEXTENCODING_UTF_8)
+ return reinterpret_cast<const char *>(id3_ucs4_utf8duplicate(str));
+ else
+ return reinterpret_cast<const char *>(id3_ucs4_latin1duplicate(str));
+}
+
+extern "C" int id3lib_render_id3tag(struct id3_tag *tag, unsigned char *buffer)
+{
+ ID3_Tag t;
+
+ const char **fid = id3tag_frame_ids;
+ for (int i = 0; *fid != NULL; fid++, i++) {
+ struct id3_frame *frame = id3_tag_findframe(tag, *fid, 0);
+ if (frame != NULL) {
+ ID3_Frame f(id3lib_frame_ids[i]);
+ id3_field_textencoding encoding = ID3_FIELD_TEXTENCODING_ISO_8859_1;
+
+ for (int j = 0;; j++) {
+ union id3_field *field = id3_frame_field(frame, j);
+ if (field == NULL)
+ break;
+
+ enum id3_field_type type = id3_field_type(field);
+ switch (type) {
+ case ID3_FIELD_TYPE_TEXTENCODING:
+ encoding = id3_field_gettextencoding(field);
+ f.GetField(ID3FN_TEXTENC)->SetEncoding(
+ encoding == ID3_FIELD_TEXTENCODING_ISO_8859_1 ? ID3TE_ISO8859_1 :
+ encoding == ID3_FIELD_TEXTENCODING_UTF_16 ? ID3TE_UTF16 :
+ encoding == ID3_FIELD_TEXTENCODING_UTF_16BE ? ID3TE_UTF16BE :
+ encoding == ID3_FIELD_TEXTENCODING_UTF_8 ? ID3TE_UTF8 :
+ ID3TE_NONE);
+ break;
+ case ID3_FIELD_TYPE_LATIN1:
+ f.GetField(ID3FN_TEXT)->Set(reinterpret_cast<const char *>(id3_field_getlatin1(field)));
+ break;
+ case ID3_FIELD_TYPE_LATIN1FULL:
+ f.GetField(ID3FN_TEXT)->Set(reinterpret_cast<const char *>(id3_field_getfulllatin1(field)));
+ break;
+
+ case ID3_FIELD_TYPE_LATIN1LIST:
+ {
+ int size = id3_field_getnstrings(field);
+ for (int k = 0; k < size; k++) {
+ f.GetField(ID3FN_TEXT)->Add(reinterpret_cast<const char *>(id3_field_getstrings(field, k)));
+ }
+ break;
+ }
+ case ID3_FIELD_TYPE_STRING:
+ f.GetField(ID3FN_TEXT)->Set(get_field_rawstring(id3_field_getstring(field), encoding));
+ break;
+ case ID3_FIELD_TYPE_STRINGFULL:
+ f.GetField(ID3FN_TEXT)->Set(get_field_rawstring(id3_field_getfullstring(field), encoding));
+ break;
+
+ case ID3_FIELD_TYPE_STRINGLIST:
+ {
+ int size = id3_field_getnstrings(field);
+ for (int k = 0; k < size; k++) {
+ f.GetField(ID3FN_TEXT)->Add(get_field_rawstring(id3_field_getstrings(field, k), encoding));
+ }
+ break;
+ }
+ }
+ }
+
+ t.AddFrame(f);
+ }
+ }
+
+ if (buffer == NULL)
+ return t.Size();
+ else
+ return t.Render(buffer);
+}
diff -Nru mp3fs-0.12.orig/src/transcode.c mp3fs-0.12/src/transcode.c
--- mp3fs-0.12.orig/src/transcode.c 2008-03-08 13:32:43.000000000 +0900
+++ mp3fs-0.12/src/transcode.c 2008-04-19 17:59:32.000000000 +0900
@@ -38,6 +38,8 @@
#include "transcode.h"
#include "talloc.h"
+int id3lib_render_id3tag(struct id3_tag *tag, unsigned char *buffer);
+
/*******************************************************************
CALLBACKS and HELPERS for LAME and FLAC
*******************************************************************/
@@ -228,16 +230,11 @@
*******************************************************************/
FileTranscoder FileTranscoder_Con(FileTranscoder self, char *filename) {
+ struct id3_file *id3file;
+
self->buffer = CONSTRUCT(StringIO, StringIO, Con, self);
self->name = talloc_strdup(self, filename);
- self->id3tag = id3_tag_new();
- if(self->id3tag == NULL) {
- goto id3_fail;
- }
-
- id3_tag_attachframe(self->id3tag, make_frame("TSSE", "MP3FS"));
-
// set the original (flac) filename
self->orig_name = talloc_size(self, strlen(self->name) + 2);
strncpy(self->orig_name, self->name, strlen(self->name));
@@ -249,6 +246,16 @@
if (strcmp(ptr, ".mp3") == 0)
strcpy(ptr, ".flac");
}
+
+ // try to read id3tag from the original file
+ id3file = id3_file_open(self->orig_name, ID3_FILE_MODE_READONLY);
+ if(id3file != NULL)
+ self->id3tag = id3_file_tag(id3file);
+ if(self->id3tag == NULL)
+ self->id3tag = id3_tag_new();
+ if(self->id3tag == NULL)
+ goto id3_fail;
+ //id3_tag_attachframe(self->id3tag, make_frame("TSSE", "MP3FS"));
// create and initialise decoder
#ifdef LEGACY_FLAC
@@ -333,8 +340,13 @@
// id3v1 tag is written into a fixed 128 byte buffer (it is a fixed size)
// grow buffer and write v2 tag
- CALL(self->buffer, seek, id3_tag_render(self->id3tag, 0), SEEK_SET);
- id3_tag_render(self->id3tag, (id3_byte_t *)self->buffer->data);
+ if(0) { // libid3tag seems not to be able to write ID3v2
+ CALL(self->buffer, seek, id3_tag_render(self->id3tag, 0), SEEK_SET);
+ id3_tag_render(self->id3tag, (id3_byte_t *)self->buffer->data);
+ } else {
+ CALL(self->buffer, seek, id3lib_render_id3tag(self->id3tag, NULL), SEEK_SET);
+ id3lib_render_id3tag(self->id3tag, self->buffer->data);
+ }
// store v1 tag
id3_tag_options(self->id3tag, ID3_TAG_OPTION_ID3V1, ~0);
@@ -347,6 +359,8 @@
+ 128;
id3_tag_delete(self->id3tag);
+ if(id3file != NULL)
+ id3_file_close(id3file);
return self;
init_encoder_fail:
@@ -362,6 +376,8 @@
flac_fail:
id3_tag_delete(self->id3tag);
+ if (id3file != NULL)
+ id3_file_close(id3file);
id3_fail:
talloc_free(self);