[libdmapsharing/LIBDMAPSHARING_2_0] Fix serving to iTunes 10



commit 2e0469975f4aa854f1e4385d7587359c517d8300
Author: W. Michael Petullo <mike flyn org>
Date:   Mon Sep 6 21:51:42 2010 -0500

    Fix serving to iTunes 10
    
    iTunes 10 is more picky about com.apple.itunes.mediakind. If it is
    requested, it must be present in response. This patch fixes serving to
    iTunes 10.
    Signed-off-by: W. Michael Petullo <mike flyn org>

 ChangeLog                       |    4 ++++
 configure.ac                    |    4 ++--
 libdmapsharing/daap-share.c     |   22 +++++++++++++++++++++-
 libdmapsharing/dmap-share.c     |   29 +++++++++++++++++++++++------
 libdmapsharing/dmap-share.h     |    2 +-
 libdmapsharing/dmap-structure.c |   10 ++++++++--
 libdmapsharing/dmap-structure.h |    8 +++++++-
 7 files changed, 66 insertions(+), 13 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index b950dcb..124c10c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+06 September 2010 W. Michael Petullo <mike flyn org>
+
+	* Fix serving to iTunes 10.
+
 04 June 2010 W. Michael Petullo <mike flyn org>
 
 	* Add dmap_db_add_with_id() to DMAPDb interface.
diff --git a/configure.ac b/configure.ac
index 82f6328..b745901 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,8 +1,8 @@
-AC_INIT(libdmapsharing, 2.0.1)
+AC_INIT(libdmapsharing, 2.0.2)
 
 dnl when going to/from release please set the nano (fourth number) right !
 dnl releases only do Wall, cvs and prerelease does Werror too
-AS_VERSION(libdmapsharing, LIBDMAPSHARING, 2, 0, 1, LIBDMAPSHARING_CVS="no", LIBDMAPSHARING_CVS="yes")
+AS_VERSION(libdmapsharing, LIBDMAPSHARING, 2, 0, 2, LIBDMAPSHARING_CVS="no", LIBDMAPSHARING_CVS="yes")
 
 AM_INIT_AUTOMAKE
 
diff --git a/libdmapsharing/daap-share.c b/libdmapsharing/daap-share.c
index cd423b9..9e8e222 100644
--- a/libdmapsharing/daap-share.c
+++ b/libdmapsharing/daap-share.c
@@ -339,7 +339,14 @@ typedef enum {
 	SONG_TRACK_NUMBER,
 	SONG_USER_RATING,
 	SONG_YEAR,
-	SONG_HAS_VIDEO
+	SONG_HAS_VIDEO,
+	SONG_SMART_PLAYLIST,
+	SONG_IS_PODCAST_PLAYLIST,
+	SONG_SPECIAL_PLAYLIST,
+	SONG_SAVED_GENIUS,
+	SONG_MEDIAKIND,
+	HAS_CHILD_CONTAINERS,
+	PARENT_CONTAINER_ID
 } DAAPMetaData;
 
 static struct DMAPMetaDataMap meta_data_map[] = {
@@ -380,6 +387,13 @@ static struct DMAPMetaDataMap meta_data_map[] = {
 	{"daap.sortalbum",		SONG_SORT_ALBUM},
 	{"daap.sortartist",		SONG_SORT_ARTIST},
 	{"com.apple.itunes.has-video",	SONG_HAS_VIDEO},
+	{"com.apple.itunes.smart-playlist",             SONG_SMART_PLAYLIST},
+	{"com.apple.itunes.is-podcast-playlist",        SONG_IS_PODCAST_PLAYLIST},
+	{"com.apple.itunes.special-playlist",           SONG_SPECIAL_PLAYLIST},
+	{"com.apple.itunes.saved-genius",               SONG_SAVED_GENIUS},
+	{"com.apple.itunes.mediakind",                  SONG_MEDIAKIND},
+	{"dmap.haschildcontainers",                     HAS_CHILD_CONTAINERS},
+	{"dmap.parentcontainerid",                      PARENT_CONTAINER_ID},
 	{ NULL,				0}};
 
 #define DAAP_ITEM_KIND_AUDIO 2
@@ -681,6 +695,12 @@ add_entry_to_mlcl (gpointer id,
 			g_warning ("Sort album requested but not available");
 	}
 
+	if (_dmap_share_client_requested (mb->bits, SONG_MEDIAKIND)) {
+		gint mediakind;
+		g_object_get (record, "mediakind", &mediakind, NULL);
+		dmap_structure_add (mlit, DMAP_CC_AEMK, mediakind);
+	}
+
 	return;
 }
 
diff --git a/libdmapsharing/dmap-share.c b/libdmapsharing/dmap-share.c
index dd2490f..55777da 100644
--- a/libdmapsharing/dmap-share.c
+++ b/libdmapsharing/dmap-share.c
@@ -1056,7 +1056,7 @@ _dmap_share_parse_meta (GHashTable *query, struct DMAPMetaDataMap *mdm)
 }
 
 void
-_dmap_share_add_playlist_to_mlcl (gpointer id, DMAPContainerRecord *record, gpointer mlcl)
+_dmap_share_add_playlist_to_mlcl (gpointer id, DMAPContainerRecord *record, gpointer _mb)
 {
 	/* MLIT listing item
 	 * MIID item id
@@ -1067,17 +1067,30 @@ _dmap_share_add_playlist_to_mlcl (gpointer id, DMAPContainerRecord *record, gpoi
 	GNode *mlit;
 	guint num_songs;
 	gchar *name;
+	struct MLCL_Bits *mb = (struct MLCL_Bits *) _mb;
 
 	num_songs = dmap_container_record_get_entry_count (record);
 	g_object_get (record, "name", &name, NULL);
 
-	mlit = dmap_structure_add ((GNode *) mlcl, DMAP_CC_MLIT);
+	/* FIXME: ITEM_ID, etc. is defined in DAAPShare, so I can't use
+	 * with _dmap_share_client_requested() here (see add_entry_to_mlcl())
+	 */
+
+	mlit = dmap_structure_add (mb->mlcl, DMAP_CC_MLIT);
 	dmap_structure_add (mlit, DMAP_CC_MIID, dmap_container_record_get_id (record));
 	/* we don't have a persistant ID for playlists, unfortunately */
 	dmap_structure_add (mlit, DMAP_CC_MPER, (gint64) dmap_container_record_get_id (record));
 	dmap_structure_add (mlit, DMAP_CC_MINM, name);
 	dmap_structure_add (mlit, DMAP_CC_MIMC, (gint32) num_songs);
 
+	/* FIXME: Is this getting music-specific? */
+	dmap_structure_add (mlit, DMAP_CC_FQUESCH, 0);
+	dmap_structure_add (mlit, DMAP_CC_MPCO, 0);
+	dmap_structure_add (mlit, DMAP_CC_AESP, 0);
+	dmap_structure_add (mlit, DMAP_CC_AEPP, 0);
+	dmap_structure_add (mlit, DMAP_CC_AEPS, 0);
+	dmap_structure_add (mlit, DMAP_CC_AESG, 0);
+
 	g_free (name);
 
 	return;
@@ -1305,8 +1318,12 @@ _dmap_share_databases (DMAPShare *share,
 	 */
 		gchar *nameprop;
 		GNode *aply;
-		GNode *mlcl;
 		GNode *mlit;
+		struct DMAPMetaDataMap *map;
+		struct MLCL_Bits mb = {NULL,0};
+
+		map = DMAP_SHARE_GET_CLASS (share)->get_meta_data_map (share);
+		mb.bits = _dmap_share_parse_meta (query, map);
 
 		g_object_get ((gpointer) share, "name", &nameprop, NULL);
 
@@ -1315,17 +1332,17 @@ _dmap_share_databases (DMAPShare *share,
 		dmap_structure_add (aply, DMAP_CC_MUTY, 0);
 		dmap_structure_add (aply, DMAP_CC_MTCO, (gint32) dmap_container_db_count (share->priv->container_db) + 1);
 		dmap_structure_add (aply, DMAP_CC_MRCO, (gint32) dmap_container_db_count (share->priv->container_db) + 1);
-		mlcl = dmap_structure_add (aply, DMAP_CC_MLCL);
+		mb.mlcl = dmap_structure_add (aply, DMAP_CC_MLCL);
 
 		/* Base playlist: */
-		mlit = dmap_structure_add (mlcl, DMAP_CC_MLIT);
+		mlit = dmap_structure_add (mb.mlcl, DMAP_CC_MLIT);
 		dmap_structure_add (mlit, DMAP_CC_MIID, (gint32) 1);
 		dmap_structure_add (mlit, DMAP_CC_MPER, (gint64) 1);
 		dmap_structure_add (mlit, DMAP_CC_MINM, nameprop);
 		dmap_structure_add (mlit, DMAP_CC_MIMC, dmap_db_count (share->priv->db));
 		dmap_structure_add (mlit, DMAP_CC_ABPL, (gchar) 1);
 
-		dmap_container_db_foreach (share->priv->container_db, (GHFunc) _dmap_share_add_playlist_to_mlcl, (gpointer) mlcl);
+		dmap_container_db_foreach (share->priv->container_db, (GHFunc) _dmap_share_add_playlist_to_mlcl, &mb);
 
 		_dmap_share_message_set_from_dmap_structure (share, message, aply);
 		dmap_structure_destroy (aply);
diff --git a/libdmapsharing/dmap-share.h b/libdmapsharing/dmap-share.h
index 3da79d5..468b1f2 100644
--- a/libdmapsharing/dmap-share.h
+++ b/libdmapsharing/dmap-share.h
@@ -217,7 +217,7 @@ bitwise  _dmap_share_parse_meta_str (const char *attrs,
 
 void _dmap_share_add_playlist_to_mlcl (gpointer id,
 				       DMAPContainerRecord *record,
-				       gpointer mlcl);
+				       gpointer mb);
 
 GSList * _dmap_share_build_filter (gchar *filterstr);
 
diff --git a/libdmapsharing/dmap-structure.c b/libdmapsharing/dmap-structure.c
index 5e9470d..c81db20 100644
--- a/libdmapsharing/dmap-structure.c
+++ b/libdmapsharing/dmap-structure.c
@@ -76,6 +76,7 @@ static const DMAPContentCodeDefinition cc_defs[] = {
     {DMAP_CC_MUSR, MAKE_CONTENT_CODE('m','u','s','r'), "dmap.serverrevision", "musr", DMAP_TYPE_INT},
     {DMAP_CC_MUTY, MAKE_CONTENT_CODE('m','u','t','y'), "dmap.updatetype", "muty", DMAP_TYPE_BYTE},
     {DMAP_CC_MUDL, MAKE_CONTENT_CODE('m','u','d','l'), "dmap.deletedidlisting", "mudl", DMAP_TYPE_CONTAINER},
+    {DMAP_CC_FQUESCH, MAKE_CONTENT_CODE('f','?','c','h'), "dmap.haschildcontainers", "f?ch", DMAP_TYPE_BYTE},
     {DMAP_CC_APRO, MAKE_CONTENT_CODE('a','p','r','o'), "daap.protocolversion", "apro", DMAP_TYPE_VERSION},
     {DMAP_CC_AVDB, MAKE_CONTENT_CODE('a','v','d','b'), "daap.serverdatabases", "avdb", DMAP_TYPE_CONTAINER},
     {DMAP_CC_ABRO, MAKE_CONTENT_CODE('a','b','r','o'), "daap.databasebrowse", "abro", DMAP_TYPE_CONTAINER},
@@ -118,7 +119,6 @@ static const DMAPContentCodeDefinition cc_defs[] = {
     {DMAP_CC_APSO, MAKE_CONTENT_CODE('a','p','s','o'), "daap.playlistsongs", "apso", DMAP_TYPE_CONTAINER},
     {DMAP_CC_PRSV, MAKE_CONTENT_CODE('p','r','s','v'), "daap.resolve", "prsv", DMAP_TYPE_CONTAINER},
     {DMAP_CC_ARIF, MAKE_CONTENT_CODE('a','r','i','f'), "daap.resolveinfo", "arif", DMAP_TYPE_CONTAINER},
-    {DMAP_CC_AESV, MAKE_CONTENT_CODE('a','e','S','V'), "com.applie.itunes.music-sharing-version", "aesv", DMAP_TYPE_INT},
     {DMAP_CC_MSAS, MAKE_CONTENT_CODE('m','s','a','s'), "daap.authentication.schemes", "msas", DMAP_TYPE_BYTE},
     {DMAP_CC_AGRP, MAKE_CONTENT_CODE('a','g','r','p'), "daap.songgrouping", "agrp", DMAP_TYPE_STRING},
     {DMAP_CC_ASCP, MAKE_CONTENT_CODE('a','s','c','p'), "daap.songcomposer", "ascp", DMAP_TYPE_STRING},
@@ -135,7 +135,13 @@ static const DMAPContentCodeDefinition cc_defs[] = {
     {DMAP_CC_PRAT, MAKE_CONTENT_CODE('p','r','a','t'), "dpap.imagerating", "prat", DMAP_TYPE_INT},
     {DMAP_CC_PCMT, MAKE_CONTENT_CODE('p','c','m','t'), "dpap.imagecomments", "pcmt", DMAP_TYPE_STRING},
     {DMAP_CC_PRET, MAKE_CONTENT_CODE('p','r','e','t'), "dpap.pret", "pret", DMAP_TYPE_STRING},
-    {DMAP_CC_AEHV, MAKE_CONTENT_CODE('a','e','H','V'), "com.apple.itunes.has-video", "aeHV", DMAP_TYPE_BYTE}
+    {DMAP_CC_AESV, MAKE_CONTENT_CODE('a','e','S','V'), "com.apple.itunes.music-sharing-version", "aesv", DMAP_TYPE_INT},
+    {DMAP_CC_AEHV, MAKE_CONTENT_CODE('a','e','H','V'), "com.apple.itunes.has-video", "aeHV", DMAP_TYPE_BYTE},
+    {DMAP_CC_AESP, MAKE_CONTENT_CODE('a','e','S','P'), "com.apple.itunes.smart-playlist", "aeSP", DMAP_TYPE_BYTE},
+    {DMAP_CC_AEPP, MAKE_CONTENT_CODE('a','e','P','P'), "com.apple.itunes.is-podcast-playlist", "aePP", DMAP_TYPE_BYTE},
+    {DMAP_CC_AEPS, MAKE_CONTENT_CODE('a','e','P','S'), "com.apple.itunes.special-playlist", "aePS", DMAP_TYPE_BYTE},
+    {DMAP_CC_AESG, MAKE_CONTENT_CODE('a','e','S','G'), "com.apple.itunes.saved-genius", "aeSG", DMAP_TYPE_BYTE},
+    {DMAP_CC_AEMK, MAKE_CONTENT_CODE('a','e','M','K'), "com.apple.itunes.mediakind", "aeMK", DMAP_TYPE_BYTE},
 };
 
 const gchar * 
diff --git a/libdmapsharing/dmap-structure.h b/libdmapsharing/dmap-structure.h
index dbd6000..44eadf9 100644
--- a/libdmapsharing/dmap-structure.h
+++ b/libdmapsharing/dmap-structure.h
@@ -75,6 +75,7 @@ typedef enum {
 	DMAP_CC_MUSR,
 	DMAP_CC_MUTY, 
 	DMAP_CC_MUDL,
+	DMAP_CC_FQUESCH,
 	DMAP_CC_APRO,
 	DMAP_CC_AVDB,
 	DMAP_CC_ABRO,
@@ -136,7 +137,12 @@ typedef enum {
 	DMAP_CC_PRET,
         
 	/* iTunes 6.02+ */
-	DMAP_CC_AEHV
+	DMAP_CC_AEHV,
+	DMAP_CC_AESP,
+	DMAP_CC_AEPP,
+	DMAP_CC_AEPS,
+	DMAP_CC_AESG,
+	DMAP_CC_AEMK,
 } DMAPContentCode;
 
 typedef struct _DMAPStructureItem DMAPStructureItem;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]