1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-12-25 04:43:33 +00:00

- add Japanese support via option (default off)

- add LICENSE (GPLv2)
- remove CONFLICTS with no more existing audio/mt-daapd
- fix whitespace bug and typo

PR:		160579
Submitted by:   Takefu <takefu at airport dot fm>
Approved by:	maintainer
This commit is contained in:
Ruslan Makhmatkhanov 2011-12-31 16:27:49 +00:00
parent 246b40f160
commit 57be37bd0d
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=288346
2 changed files with 153 additions and 5 deletions

View File

@ -6,7 +6,7 @@
PORTNAME= firefly
PORTVERSION= 1696
PORTREVISION= 5
PORTREVISION= 6
CATEGORIES= audio
MASTER_SITES= http://nightlies.fireflymediaserver.org/nightlies/svn-${PORTVERSION}/ \
http://www.magnesium.net/~mdf/distfiles/
@ -15,6 +15,8 @@ DISTNAME= mt-daapd-svn-${PORTVERSION}
MAINTAINER= mark@foster.cc
COMMENT= Open-source media server for the Roku SoundBridge and iTunes
LICENSE= GPLv2
BUILD_DEPENDS= ${LOCALBASE}/include/vorbis/codec.h:${PORTSDIR}/audio/libvorbis \
${LOCALBASE}/include/FLAC/metadata.h:${PORTSDIR}/audio/flac
RUN_DEPENDS= oggdec:${PORTSDIR}/audio/vorbis-tools \
@ -23,8 +25,6 @@ LIB_DEPENDS= ogg:${PORTSDIR}/audio/libogg \
sqlite3.8:${PORTSDIR}/databases/sqlite3 \
id3tag.0:${PORTSDIR}/audio/libid3tag
CONFLICTS= mt-daapd-0.2.*
GNU_CONFIGURE= yes
CONFIGURE_ENV= LIBS="-L${LOCALBASE}/lib ${PTHREAD_LIBS}"
CFLAGS+= ${PTHREAD_CFLAGS}
@ -45,15 +45,25 @@ PLIST_SUB+= DAAPD_DBDIR=${DAAPD_DBDIR}
USE_LDCONFIG= yes
OPTIONS= JAPANESE "Japanese support in ID3 tags" off
.include <bsd.port.options.mk>
.if defined(WITH_JAPANESE)
EXTRA_PATCHES= ${FILESDIR}/extra-patch-src_scan-mp3.c
USE_ICONV= yes
CONFIGURE_ARGS+= --enable-iconv
.endif
pre-everything::
@${ECHO_CMD} "Define vars bellow if you need:"
@${ECHO_CMD} "Define vars below if you need:"
@${ECHO_CMD} "DAAPD_USER=${DAAPD_USER} (default: daapd)"
@${ECHO_CMD} "DAAPD_GROUP=${DAAPD_GROUP} (default: daapd)"
@${ECHO_CMD} "DAAPD_DBDIR=${DAAPD_DBDIR} (default: ${PREFIX}/var/db/${PORTNAME})"
post-patch:
@${REINPLACE_CMD} -e 's|echo aout|echo elf|' \
${WRKSRC}/configure
${WRKSRC}/configure
post-install:
.if !defined(NOPORTDOCS)

View File

@ -0,0 +1,138 @@
--- src/scan-mp3.c.orig 2007-09-25 16:55:23.000000000 +0900
+++ src/scan-mp3.c 2011-09-05 13:52:16.000000000 +0900
@@ -18,6 +18,15 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#define USE_CP932
+
+#ifdef USE_CP932
+ #define UNKNOWN_STR "UNKNOWN"
+ #ifndef FILESYSTEM_CES
+ #define FILESYSTEM_CES "CP932"
+ #endif
+#endif
+
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
@@ -34,6 +43,10 @@
#include <string.h>
#include <time.h>
+#ifdef USE_CP932
+ #include <iconv.h>
+#endif
+
#include "daapd.h"
#include "conf.h"
#include "err.h"
@@ -289,6 +302,96 @@
return 1;
}
+#ifdef USE_CP932
+#define MAX_ICONV_BUF 1024
+
+typedef enum {
+ ICONV_OK,
+ ICONV_TRYNEXT,
+ ICONV_FATAL
+} iconv_result;
+
+static iconv_result do_convert(const char* to_ces, const char* from_ces,
+ char *inbuf, size_t inbytesleft,
+ char *outbuf_orig, size_t outbytesleft_orig) {
+ size_t rc;
+ iconv_result ret = ICONV_OK;
+
+ size_t outbytesleft = outbytesleft_orig - 1;
+ char* outbuf = outbuf_orig;
+
+ iconv_t cd = iconv_open(to_ces, from_ces);
+ if (cd == (iconv_t)-1) {
+ return ICONV_FATAL;
+ }
+ rc = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+ if (rc == (size_t)-1) {
+ if (errno == E2BIG) {
+ ret = ICONV_FATAL;
+ } else {
+ ret = ICONV_TRYNEXT;
+ memset(outbuf_orig, '\0', outbytesleft_orig);
+ }
+ }
+ iconv_close(cd);
+
+ return ret;
+}
+
+static unsigned char* get_utf8_text(const id3_ucs4_t* native_text) {
+ unsigned char* utf8_text = NULL;
+ char * in, * in8, * iconv_buf;
+ iconv_result rc;
+
+ in = (char*)id3_ucs4_latin1duplicate(native_text);
+ if (!in) goto out;
+
+ in8 = (char*)id3_ucs4_utf8duplicate(native_text);
+ if (!in8) {
+ free(in);
+ goto out;
+ }
+
+ iconv_buf = (char*)calloc(MAX_ICONV_BUF, sizeof(char));
+ if (!iconv_buf) {
+ free(in); free(in8);
+ goto out;
+ }
+
+ /* (1) try utf8 -> cp932 */
+ rc = do_convert("CP932", "UTF-8", in8, strlen(in8), iconv_buf, MAX_ICONV_BUF);
+ if (rc == ICONV_OK) {
+ utf8_text = (unsigned char*)in8;
+ free(iconv_buf);
+ } else if (rc == ICONV_TRYNEXT) {
+ /* (2) try cp932 -> utf8 */
+ rc = do_convert("UTF-8", "CP932", in, strlen(in), iconv_buf, MAX_ICONV_BUF);
+ if (rc == ICONV_OK) {
+ utf8_text = (unsigned char*)iconv_buf;
+ } else if (rc == ICONV_TRYNEXT) {
+ /* (3) try euc-jp -> utf8 */
+ rc = do_convert("UTF-8", "EUC-JP", in, strlen(in), iconv_buf, MAX_ICONV_BUF);
+ if (rc == ICONV_OK) {
+ utf8_text = (unsigned char*)iconv_buf;
+ } else if (rc == ICONV_TRYNEXT) {
+ /* utf-8 including non-japanese char? fallback. */
+ utf8_text = (unsigned char*)id3_ucs4_utf8duplicate(native_text);
+ free(iconv_buf);
+ }
+ }
+ free(in8);
+ }
+ free(in);
+
+ out:
+ if (!utf8_text) {
+ utf8_text = (unsigned char*)strdup(UNKNOWN_STR);
+ }
+
+ return utf8_text;
+}
+#endif
+
int scan_mp3_get_mp3tags(char *file, MP3FILE *pmp3) {
struct id3_file *pid3file;
struct id3_tag *pid3tag;
@@ -352,8 +455,11 @@
if(native_text) {
have_utf8=1;
-
+#ifdef USE_CP932
+ utf8_text = (char *)get_utf8_text(native_text);
+#else
utf8_text = (char*)id3_ucs4_utf8duplicate(native_text);
+#endif
if(utf8_text)
mem_register(utf8_text,0);