summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--docs/reference/tmpl/smart-playlists.sgml8
-rw-r--r--src/itdb.h18
-rw-r--r--src/itdb_itunesdb.c6
-rw-r--r--src/itdb_playlist.c129
5 files changed, 125 insertions, 43 deletions
diff --git a/ChangeLog b/ChangeLog
index 29bc039..3adcdd5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,13 @@
src/artwork-writer.c: Set unknown2 of mhfd header to 2 instead
of 1, otherwise iTunes7 wipes the ArtworkDB.
+ * src/itdb.h
+ src/itdb_itunesdb.c
+ src/itdb_playlist.c:
+ Updated smart playlist handling to recognize album artist, tv
+ show, last skipped, season number, skipcount and video kind
+ fields.
+
2007-02-09 Jorg Schuler <jcsjcs at users.sourceforge.net>
* ChangeLog
diff --git a/docs/reference/tmpl/smart-playlists.sgml b/docs/reference/tmpl/smart-playlists.sgml
index 2d1d540..a6c4dbd 100644
--- a/docs/reference/tmpl/smart-playlists.sgml
+++ b/docs/reference/tmpl/smart-playlists.sgml
@@ -69,6 +69,7 @@ These functions and structures are for dealing with smart playlists.
@SPLACTION_IS_LESS_THAN:
@SPLACTION_IS_IN_THE_RANGE:
@SPLACTION_IS_IN_THE_LAST:
+@SPLACTION_BINARY_AND:
@SPLACTION_IS_STRING:
@SPLACTION_CONTAINS:
@SPLACTION_STARTS_WITH:
@@ -110,6 +111,7 @@ These functions and structures are for dealing with smart playlists.
@splat_none:
@splat_invalid:
@splat_unknown:
+@splat_binary_and:
<!-- ##### ENUM SPLField ##### -->
<para>
@@ -139,6 +141,12 @@ These functions and structures are for dealing with smart playlists.
@SPLFIELD_BPM:
@SPLFIELD_GROUPING:
@SPLFIELD_PLAYLIST:
+@SPLFIELD_VIDEO_KIND:
+@SPLFIELD_TVSHOW:
+@SPLFIELD_SEASON_NR:
+@SPLFIELD_SKIPCOUNT:
+@SPLFIELD_LAST_SKIPPED:
+@SPLFIELD_ALBUMARTIST:
<!-- ##### MACRO SPLDATE_IDENTIFIER ##### -->
<para>
diff --git a/src/itdb.h b/src/itdb.h
index e2f4dcc..a91b2d1 100644
--- a/src/itdb.h
+++ b/src/itdb.h
@@ -1,4 +1,4 @@
-/* Time-stamp: <2007-01-19 00:59:18 jcs>
+/* Time-stamp: <2007-02-24 23:11:13 jcs>
|
| Copyright (C) 2002-2006 Jorg Schuler <jcsjcs at users sourceforge net>
| Part of the gtkpod project.
@@ -212,6 +212,7 @@ typedef enum {
SPLACTION_IS_LESS_THAN = 0x00000040, /* "Is Before" in iTunes */
SPLACTION_IS_IN_THE_RANGE = 0x00000100,
SPLACTION_IS_IN_THE_LAST = 0x00000200,
+ SPLACTION_BINARY_AND = 0x00000400,
SPLACTION_IS_STRING = 0x01000001,
SPLACTION_CONTAINS = 0x01000002,
@@ -258,7 +259,8 @@ typedef enum
splat_playlist,
splat_none,
splat_invalid,
- splat_unknown
+ splat_unknown,
+ splat_binary_and
} SPLActionType;
@@ -325,10 +327,16 @@ typedef enum {
SPLACTION_IS_NOT_INT/from=1) */
SPLFIELD_BPM = 0x23, /* Int (e.g. from/to = 60) */
SPLFIELD_GROUPING = 0x27, /* String */
- SPLFIELD_PLAYLIST = 0x28, /* XXX - Unknown...not parsed
+ SPLFIELD_PLAYLIST = 0x28, /* FIXME - Unknown...not parsed
correctly...from/to = 0xb6fbad5f
- for * "Purchased Music". Extra
- data after * "to"... */
+ for "Purchased Music". Extra
+ data after "to"... */
+ SPLFIELD_VIDEO_KIND = 0x3c, /* Logic Int */
+ SPLFIELD_TVSHOW = 0x3e, /* String */
+ SPLFIELD_SEASON_NR = 0x3f, /* Int */
+ SPLFIELD_SKIPCOUNT = 0x44, /* Int */
+ SPLFIELD_LAST_SKIPPED = 0x45, /* Int/Mac Timestamp */
+ SPLFIELD_ALBUMARTIST = 0x47 /* String */
} SPLField;
#define SPLDATE_IDENTIFIER (G_GINT64_CONSTANT (0x2dae2dae2dae2daeU))
diff --git a/src/itdb_itunesdb.c b/src/itdb_itunesdb.c
index 8cb30ae..f44176f 100644
--- a/src/itdb_itunesdb.c
+++ b/src/itdb_itunesdb.c
@@ -1,4 +1,4 @@
-/* Time-stamp: <2007-01-19 01:00:08 jcs>
+/* Time-stamp: <2007-02-24 19:13:02 jcs>
|
| Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
| Part of the gtkpod project.
@@ -1432,7 +1432,7 @@ static MHODData get_mhod (FContents *cts, glong mhod_seek, guint32 *ml)
result.data.splrules->rules, splr);
if (!check_seek (cts, seek, 56))
goto splrules_error;
- splr->field = get32bint (cts, seek);
+ splr->field = get32bint (cts, seek);
splr->action = get32bint (cts, seek+4);
seek += 52;
length = get32bint (cts, seek);
@@ -1469,7 +1469,7 @@ static MHODData get_mhod (FContents *cts, glong mhod_seek, guint32 *ml)
splr->tovalue = get64bint (cts, seek+28);
splr->todate = get64bint (cts, seek+36);
splr->tounits = get64bint (cts, seek+44);
- /* SPLFIELD_PLAYLIST seem to use these unknowns*/
+ /* SPLFIELD_PLAYLIST seems to use these unknowns*/
splr->unk052 = get32bint (cts, seek+52);
splr->unk056 = get32bint (cts, seek+56);
splr->unk060 = get32bint (cts, seek+60);
diff --git a/src/itdb_playlist.c b/src/itdb_playlist.c
index 0ed0060..132912c 100644
--- a/src/itdb_playlist.c
+++ b/src/itdb_playlist.c
@@ -1,4 +1,4 @@
-/* Time-stamp: <2006-10-22 17:42:28 jcs>
+/* Time-stamp: <2007-02-25 00:14:27 jcs>
|
| Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
| Part of the gtkpod project.
@@ -71,6 +71,7 @@ gboolean itdb_spl_action_known (SPLAction action)
case SPLACTION_IS_NOT_IN_THE_LAST:
case SPLACTION_IS_NOT:
case SPLACTION_DOES_NOT_CONTAIN:
+ case SPLACTION_BINARY_AND:
result = TRUE;
}
if (result == FALSE)
@@ -93,17 +94,19 @@ SPLFieldType itdb_splr_get_field_type (const SPLRule *splr)
{
g_return_val_if_fail (splr != NULL, splft_unknown);
- switch(splr->field)
+ switch((SPLField)splr->field)
{
case SPLFIELD_SONG_NAME:
case SPLFIELD_ALBUM:
+ case SPLFIELD_ALBUMARTIST:
case SPLFIELD_ARTIST:
case SPLFIELD_GENRE:
case SPLFIELD_KIND:
case SPLFIELD_COMMENT:
case SPLFIELD_COMPOSER:
case SPLFIELD_GROUPING:
- return(splft_string);
+ case SPLFIELD_TVSHOW:
+ return splft_string;
case SPLFIELD_BITRATE:
case SPLFIELD_SAMPLE_RATE:
case SPLFIELD_YEAR:
@@ -115,15 +118,20 @@ SPLFieldType itdb_splr_get_field_type (const SPLRule *splr)
case SPLFIELD_RATING:
case SPLFIELD_TIME: /* time is the length of the track in
milliseconds */
- return(splft_int);
+ case SPLFIELD_SEASON_NR:
+ case SPLFIELD_SKIPCOUNT:
+ return splft_int;
case SPLFIELD_COMPILATION:
- return(splft_boolean);
+ return splft_boolean;
case SPLFIELD_DATE_MODIFIED:
case SPLFIELD_DATE_ADDED:
case SPLFIELD_LAST_PLAYED:
- return(splft_date);
+ case SPLFIELD_LAST_SKIPPED:
+ return splft_date;
case SPLFIELD_PLAYLIST:
- return(splft_playlist);
+ return splft_playlist;
+ case SPLFIELD_VIDEO_KIND:
+ return splft_int;
}
return(splft_unknown);
}
@@ -148,7 +156,7 @@ SPLActionType itdb_splr_get_action_type (const SPLRule *splr)
switch(fieldType)
{
case splft_string:
- switch (splr->action)
+ switch ((SPLAction)splr->action)
{
case SPLACTION_IS_STRING:
case SPLACTION_IS_NOT:
@@ -169,16 +177,15 @@ SPLActionType itdb_splr_get_action_type (const SPLRule *splr)
case SPLACTION_IS_IN_THE_RANGE:
case SPLACTION_IS_IN_THE_LAST:
case SPLACTION_IS_NOT_IN_THE_LAST:
+ case SPLACTION_BINARY_AND:
return splat_invalid;
- default:
- /* Unknown action type */
- g_warning ("Unknown action type %d\n\n", splr->action);
- return splat_unknown;
}
- break;
+ /* Unknown action type */
+ g_warning ("Unknown action type %d\n\n", splr->action);
+ return splat_unknown;
case splft_int:
- switch (splr->action)
+ switch ((SPLAction)splr->action)
{
case SPLACTION_IS_INT:
case SPLACTION_IS_NOT_INT:
@@ -190,6 +197,8 @@ SPLActionType itdb_splr_get_action_type (const SPLRule *splr)
case SPLACTION_IS_NOT_IN_THE_RANGE:
case SPLACTION_IS_IN_THE_RANGE:
return splat_range_int;
+ case SPLACTION_BINARY_AND:
+ return splat_binary_and;
case SPLACTION_IS_STRING:
case SPLACTION_CONTAINS:
case SPLACTION_STARTS_WITH:
@@ -201,18 +210,16 @@ SPLActionType itdb_splr_get_action_type (const SPLRule *splr)
case SPLACTION_IS_NOT:
case SPLACTION_DOES_NOT_CONTAIN:
return splat_invalid;
- default:
- /* Unknown action type */
- g_warning ("Unknown action type %d\n\n", splr->action);
- return splat_unknown;
}
- break;
+ /* Unknown action type */
+ g_warning ("Unknown action type %d\n\n", splr->action);
+ return splat_unknown;
case splft_boolean:
return splat_none;
case splft_date:
- switch (splr->action)
+ switch ((SPLAction)splr->action)
{
case SPLACTION_IS_INT:
case SPLACTION_IS_NOT_INT:
@@ -235,16 +242,15 @@ SPLActionType itdb_splr_get_action_type (const SPLRule *splr)
case SPLACTION_DOES_NOT_END_WITH:
case SPLACTION_IS_NOT:
case SPLACTION_DOES_NOT_CONTAIN:
+ case SPLACTION_BINARY_AND:
return splat_invalid;
- default:
- /* Unknown action type */
- g_warning ("Unknown action type %d\n\n", splr->action);
- return splat_unknown;
}
- break;
+ /* Unknown action type */
+ g_warning ("Unknown action type %d\n\n", splr->action);
+ return splat_unknown;
case splft_playlist:
- switch (splr->action)
+ switch ((SPLAction)splr->action)
{
case SPLACTION_IS_INT:
case SPLACTION_IS_NOT_INT:
@@ -265,17 +271,17 @@ SPLActionType itdb_splr_get_action_type (const SPLRule *splr)
case SPLACTION_DOES_NOT_END_WITH:
case SPLACTION_IS_NOT:
case SPLACTION_DOES_NOT_CONTAIN:
+ case SPLACTION_BINARY_AND:
return splat_invalid;
- default:
- /* Unknown action type */
- g_warning ("Unknown action type %d\n\n", splr->action);
- return splat_unknown;
}
+ /* Unknown action type */
+ g_warning ("Unknown action type %d\n\n", splr->action);
+ return splat_unknown;
case splft_unknown:
- /* Unknown action type */
- g_warning ("Unknown action type %d\n\n", splr->action);
- return splat_unknown;
+ /* Unknown action type */
+ g_warning ("Unknown action type %d\n\n", splr->action);
+ return splat_unknown;
}
return splat_unknown;
}
@@ -306,6 +312,7 @@ gboolean itdb_splr_eval (SPLRule *splr, Itdb_Track *track)
gchar *strcomp = NULL;
gint64 intcomp = 0;
gboolean boolcomp = FALSE;
+ gboolean handled = FALSE;
guint32 datecomp = 0;
Itdb_Playlist *playcomp = NULL;
time_t t;
@@ -325,75 +332,124 @@ gboolean itdb_splr_eval (SPLRule *splr, Itdb_Track *track)
{
case SPLFIELD_SONG_NAME:
strcomp = track->title;
+ handled = TRUE;
break;
case SPLFIELD_ALBUM:
strcomp = track->album;
+ handled = TRUE;
break;
case SPLFIELD_ARTIST:
strcomp = track->artist;
+ handled = TRUE;
break;
case SPLFIELD_GENRE:
strcomp = track->genre;
+ handled = TRUE;
break;
case SPLFIELD_KIND:
strcomp = track->filetype;
+ handled = TRUE;
break;
case SPLFIELD_COMMENT:
strcomp = track->comment;
+ handled = TRUE;
break;
case SPLFIELD_COMPOSER:
strcomp = track->composer;
+ handled = TRUE;
break;
case SPLFIELD_GROUPING:
strcomp = track->grouping;
+ handled = TRUE;
break;
case SPLFIELD_BITRATE:
intcomp = track->bitrate;
+ handled = TRUE;
break;
case SPLFIELD_SAMPLE_RATE:
intcomp = track->samplerate;
+ handled = TRUE;
break;
case SPLFIELD_YEAR:
intcomp = track->year;
+ handled = TRUE;
break;
case SPLFIELD_TRACKNUMBER:
intcomp = track->track_nr;
+ handled = TRUE;
break;
case SPLFIELD_SIZE:
intcomp = track->size;
+ handled = TRUE;
break;
case SPLFIELD_PLAYCOUNT:
intcomp = track->playcount;
+ handled = TRUE;
break;
case SPLFIELD_DISC_NUMBER:
intcomp = track->cd_nr;
+ handled = TRUE;
break;
case SPLFIELD_BPM:
intcomp = track->BPM;
+ handled = TRUE;
break;
case SPLFIELD_RATING:
intcomp = track->rating;
+ handled = TRUE;
break;
case SPLFIELD_TIME:
intcomp = track->tracklen/1000;
+ handled = TRUE;
break;
case SPLFIELD_COMPILATION:
boolcomp = track->compilation;
+ handled = TRUE;
break;
case SPLFIELD_DATE_MODIFIED:
datecomp = track->time_modified;
+ handled = TRUE;
break;
case SPLFIELD_DATE_ADDED:
datecomp = track->time_added;
+ handled = TRUE;
break;
case SPLFIELD_LAST_PLAYED:
datecomp = track->time_played;
+ handled = TRUE;
break;
case SPLFIELD_PLAYLIST:
playcomp = itdb_playlist_by_id (track->itdb, splr->fromvalue);
+ handled = TRUE;
break;
- default: /* unknown field type */
- g_return_val_if_fail (FALSE, FALSE);
+ case SPLFIELD_ALBUMARTIST:
+ strcomp = track->albumartist;
+ handled = TRUE;
+ break;
+ case SPLFIELD_TVSHOW:
+ strcomp = track->tvshow;
+ handled = TRUE;
+ break;
+ case SPLFIELD_LAST_SKIPPED:
+ datecomp = track->last_skipped;
+ handled = TRUE;
+ break;
+ case SPLFIELD_SEASON_NR:
+ intcomp = track->season_nr;
+ handled = TRUE;
+ break;
+ case SPLFIELD_SKIPCOUNT:
+ intcomp = track->skipcount;
+ handled = TRUE;
+ break;
+ case SPLFIELD_VIDEO_KIND:
+ intcomp = track->mediatype;
+ handled = TRUE;
+ break;
+ }
+ if (!handled)
+ { /* unknown field type -- default to FALSE */
+ g_return_val_if_reached (FALSE);
}
/* actually do the comparison to our rule */
@@ -451,6 +507,8 @@ gboolean itdb_splr_eval (SPLRule *splr, Itdb_Track *track)
intcomp < splr->tovalue) ||
(intcomp > splr->fromvalue &&
intcomp > splr->tovalue));
+ case SPLACTION_BINARY_AND:
+ return (intcomp & splr->fromvalue)? TRUE:FALSE;
}
return FALSE;
case splft_boolean:
@@ -887,6 +945,7 @@ void itdb_splr_validate (SPLRule *splr)
case splat_int:
case splat_playlist:
case splat_date:
+ case splat_binary_and:
splr->fromdate = 0;
splr->fromunits = 1;
splr->tovalue = splr->fromvalue;