diff options
author | Jorg Schuler <jcsjcs@users.sourceforge.net> | 2005-09-24 04:26:41 +0000 |
---|---|---|
committer | Jorg Schuler <jcsjcs@users.sourceforge.net> | 2005-09-24 04:26:41 +0000 |
commit | 6a0e830586380aafe71e9709814624057e21ca79 (patch) | |
tree | 60f70b379afade08c1ff358dfab7a6724d0eba7a | |
parent | e89c06607a5763356e0d11e3871b2a3f1e444a94 (diff) | |
download | libgpod-tmz-6a0e830586380aafe71e9709814624057e21ca79.tar.gz libgpod-tmz-6a0e830586380aafe71e9709814624057e21ca79.tar.xz libgpod-tmz-6a0e830586380aafe71e9709814624057e21ca79.zip |
* itdb.h/itdb_playlist.c: new functions: itdb_playlist_is_mpl()
and itdb_playlist_is_podcasts()
* itdb_track.c: update itdb_track_duplicate()
* itdb_itunesdb.c: read/write timestamp in playlists. Set
timestamp if previously unset.
* itdb_playlist.c: set timestamp when creating playlist, set
timestamp when adding playlist and no timestamp was set.
git-svn-id: https://gtkpod.svn.sf.net/svnroot/gtkpod/libgpod/trunk@1101 f01d2545-417e-4e96-918e-98f8d0dbbcb6
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/itdb.h | 11 | ||||
-rw-r--r-- | src/itdb_itunesdb.c | 17 | ||||
-rw-r--r-- | src/itdb_playlist.c | 48 | ||||
-rw-r--r-- | src/itdb_track.c | 36 |
6 files changed, 101 insertions, 26 deletions
@@ -1,3 +1,16 @@ +2005-09-24 Jorg Schuler <jcsjcs at users.sourceforge.net> + + * itdb.h/itdb_playlist.c: new functions: itdb_playlist_is_mpl() + and itdb_playlist_is_podcasts() + + * itdb_track.c: update itdb_track_duplicate() + + * itdb_itunesdb.c: read/write timestamp in playlists. Set + timestamp if previously unset. + + * itdb_playlist.c: set timestamp when creating playlist, set + timestamp when adding playlist and no timestamp was set. + 2005-09-23 Jorg Schuler <jcsjcs at users.sourceforge.net> * bindings/: added python bindings provided by Nicholas Piper diff --git a/configure.ac b/configure.ac index 92490ba..4cbed98 100644 --- a/configure.ac +++ b/configure.ac @@ -13,7 +13,7 @@ AM_CONFIG_HEADER(config.h) # LIBGPOD_MAJOR_VERSION=0 LIBGPOD_MINOR_VERSION=1 -LIBGPOD_MICRO_VERSION=5 +LIBGPOD_MICRO_VERSION=6 LIBGPOD_INTERFACE_AGE=0 # If you need a modifier for the version number. # Normally empty, but can be used to make "fixup" releases. @@ -1,4 +1,4 @@ -/* Time-stamp: <2005-09-24 01:48:50 jcs> +/* Time-stamp: <2005-09-24 12:59:15 jcs> | | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> | Part of the gtkpod project. @@ -47,16 +47,18 @@ /* one star is how much (track->rating) */ #define ITDB_RATING_STEP 20 +/* always use itdb_playlist_is_mpl() to check for MPL! */ enum ItdbPlType { /* types for playlist->type */ ITDB_PL_TYPE_NORM = 0, /* normal playlist, visible in iPod */ ITDB_PL_TYPE_MPL = 1 /* master playlist, contains all tracks, not visible in iPod */ }; +/* always use itdb_playlists_is_podcasts() to check for podcasts PL */ enum ItdbPlFlag { /* types for playlist->podcastflag */ ITDB_PL_FLAG_NORM = 0, /* normal playlist, visible under 'Playlists */ - ITDB_PL_FLAG_PODCAST = 1 /* special podcast playlist visible + ITDB_PL_FLAG_PODCASTS = 1 /* special podcast playlist visible under 'Music' */ }; @@ -654,7 +656,7 @@ gboolean itdb_shuffle_write_file (Itdb_iTunesDB *itdb, const gchar *filename, GError **error); Itdb_iTunesDB *itdb_new (void); void itdb_free (Itdb_iTunesDB *itdb); -Itdb_iTunesDB *itdb_duplicate (Itdb_iTunesDB *itdb); +Itdb_iTunesDB *itdb_duplicate (Itdb_iTunesDB *itdb); /* not implemented */ guint32 itdb_tracks_number (Itdb_iTunesDB *itdb); guint32 itdb_tracks_number_nontransferred (Itdb_iTunesDB *itdb); guint32 itdb_playlists_number (Itdb_iTunesDB *itdb); @@ -699,7 +701,10 @@ void itdb_playlist_add_track (Itdb_Playlist *pl, Itdb_Playlist *itdb_playlist_by_id (Itdb_iTunesDB *itdb, guint64 id); Itdb_Playlist *itdb_playlist_by_nr (Itdb_iTunesDB *itdb, guint32 num); Itdb_Playlist *itdb_playlist_by_name (Itdb_iTunesDB *itdb, gchar *name); +gboolean itdb_playlist_is_mpl (Itdb_Playlist *pl); +gboolean itdb_playlist_is_podcasts (Itdb_Playlist *pl); Itdb_Playlist *itdb_playlist_mpl (Itdb_iTunesDB *itdb); +Itdb_Playlist *itdb_playlist_podcasts (Itdb_iTunesDB *itdb); gboolean itdb_playlist_contains_track (Itdb_Playlist *pl, Itdb_Track *track); guint32 itdb_playlist_contain_track_number (Itdb_Track *tr); void itdb_playlist_remove_track (Itdb_Playlist *pl, Itdb_Track *track); diff --git a/src/itdb_itunesdb.c b/src/itdb_itunesdb.c index bbaaba4..0a55075 100644 --- a/src/itdb_itunesdb.c +++ b/src/itdb_itunesdb.c @@ -1,4 +1,4 @@ -/* Time-stamp: <2005-09-24 01:56:22 jcs> +/* Time-stamp: <2005-09-24 13:25:33 jcs> | | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> | Part of the gtkpod project. @@ -843,12 +843,11 @@ void itdb_free (Itdb_iTunesDB *itdb) } } -/* Free the memory taken by @itdb. */ +/* Duplicate @itdb */ +/* FIXME: not implemented yet */ Itdb_iTunesDB *itdb_duplicate (Itdb_iTunesDB *itdb) { g_return_val_if_fail (itdb, NULL); - g_return_val_if_fail (!itdb->userdata || - itdb->userdata_duplicate, NULL); /* FIXME: not yet implemented */ g_return_val_if_reached (NULL); } @@ -1550,6 +1549,7 @@ static glong get_playlist (FImport *fimp, glong mhyp_seek) /* Some Playlists have added 256 to their type -- I don't know what it's for, so we just ignore it for now -> & 0xff */ plitem->type = get32lint (cts, mhyp_seek+20) & 0xff; + plitem->timestamp = get32lint (cts, mhyp_seek+24); plitem->id = get64lint (cts, mhyp_seek+28); plitem->mhodcount = get32lint (cts, mhyp_seek+36); plitem->libmhodcount = get16lint (cts, mhyp_seek+40); @@ -1639,11 +1639,11 @@ static glong get_playlist (FImport *fimp, glong mhyp_seek) if (!plitem->name) { /* we did not read a valid mhod TITLE header -> */ /* we simply make up our own name */ - if (plitem->type == ITDB_PL_TYPE_MPL) + if (itdb_playlist_is_mpl (plitem)) plitem->name = _("Master-PL"); else { - if (plitem->podcastflag == ITDB_PL_FLAG_PODCAST) + if (itdb_playlist_is_podcasts (plitem)) plitem->name = _("Podcasts"); else plitem->name = _("Playlist"); @@ -3290,7 +3290,7 @@ static gboolean write_playlist (FExport *fexp, /* number of tracks in plist */ put32lint (cts, -1); /* number of mhips -> later */ put32lint (cts, pl->type); /* 1 = main, 0 = visible */ - put32lint (cts, 0); /* some timestamp */ + put32lint (cts, pl->timestamp);/* some timestamp */ put64lint (cts, pl->id); /* 64 bit ID */ pl->mhodcount = 1; /* we only write one mhod type < 50 */ put32lint (cts, pl->mhodcount); @@ -3310,8 +3310,7 @@ static gboolean write_playlist (FExport *fexp, mk_mhod (cts, MHOD_ID_SPLRULES, &pl->splrules); } - if ((pl->podcastflag == ITDB_PL_FLAG_PODCAST) && - (mhsd_type == 3)) + if (itdb_playlist_is_podcasts(pl) && (mhsd_type == 3)) { /* write special podcast playlist */ result = write_podcast_mhips (fexp, pl, mhyp_seek); diff --git a/src/itdb_playlist.c b/src/itdb_playlist.c index 362e8e5..7e3bebb 100644 --- a/src/itdb_playlist.c +++ b/src/itdb_playlist.c @@ -1,4 +1,4 @@ -/* Time-stamp: <2005-09-19 22:54:16 jcs> +/* Time-stamp: <2005-09-24 13:25:33 jcs> | | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> | Part of the gtkpod project. @@ -938,7 +938,6 @@ Itdb_Playlist *itdb_playlist_duplicate (Itdb_Playlist *pl) GList *gl; g_return_val_if_fail (pl, NULL); - g_return_val_if_fail (!pl->userdata || pl->userdata_duplicate, NULL); pl_dup = g_new0 (Itdb_Playlist, 1); memcpy (pl_dup, pl, sizeof (Itdb_Playlist)); @@ -968,7 +967,7 @@ Itdb_Playlist *itdb_playlist_duplicate (Itdb_Playlist *pl) pl_dup->id = 0; /* Copy userdata */ - if (pl->userdata) + if (pl->userdata && pl->userdata_duplicate) pl_dup->userdata = pl->userdata_duplicate (pl->userdata); return pl_dup; @@ -1018,6 +1017,8 @@ Itdb_Playlist *itdb_playlist_new (const gchar *title, gboolean spl) pl->name = g_strdup (title); pl->sortorder = ITDB_PSO_MANUAL; + pl->timestamp = itdb_time_get_mac_time (); + pl->is_spl = spl; if (spl) { @@ -1088,6 +1089,7 @@ void itdb_playlist_add (Itdb_iTunesDB *itdb, Itdb_Playlist *pl, gint32 pos) pl->id = id; } if (pl->sortorder == 0) pl->sortorder = ITDB_PSO_MANUAL; + if (pl->timestamp == 0) pl->timestamp = itdb_time_get_mac_time (); if (pos == -1) itdb->playlists = g_list_append (itdb->playlists, pl); else itdb->playlists = g_list_insert (itdb->playlists, pl, pos); } @@ -1228,6 +1230,24 @@ Itdb_Playlist *itdb_playlist_by_name (Itdb_iTunesDB *itdb, gchar *name) } +/* check if playlist is master playlist */ +gboolean itdb_playlist_is_mpl (Itdb_Playlist *pl) +{ + g_return_val_if_fail (pl, FALSE); + + return (pl->type == ITDB_PL_TYPE_MPL); +} + + +/* check if playlist is podcasts playlist */ +gboolean itdb_playlist_is_podcasts (Itdb_Playlist *pl) +{ + g_return_val_if_fail (pl, FALSE); + + return (pl->podcastflag == ITDB_PL_FLAG_PODCASTS); +} + + /* return the master playlist of @itdb */ Itdb_Playlist *itdb_playlist_mpl (Itdb_iTunesDB *itdb) { @@ -1239,12 +1259,32 @@ Itdb_Playlist *itdb_playlist_mpl (Itdb_iTunesDB *itdb) g_return_val_if_fail (pl, NULL); /* mpl is guaranteed to be at first position... */ - g_return_val_if_fail (pl->type == ITDB_PL_TYPE_MPL, NULL); + g_return_val_if_fail (itdb_playlist_is_mpl (pl), NULL); return pl; } +/* return the podcasts playlist of @itdb, if available */ +Itdb_Playlist *itdb_playlist_podcasts (Itdb_iTunesDB *itdb) +{ + GList *gl; + + g_return_val_if_fail (itdb, NULL); + + for (gl=itdb->playlists; gl; gl=gl->next) + { + Itdb_Playlist *pl = gl->data; + g_return_val_if_fail (pl, NULL); + + if (itdb_playlist_is_podcasts (pl)) return pl; + } + + return NULL; +} + + + /* checks if @track is in playlist @pl. TRUE, if yes, FALSE otherwise. If @pl is NULL, the */ gboolean itdb_playlist_contains_track (Itdb_Playlist *pl, Itdb_Track *tr) diff --git a/src/itdb_track.c b/src/itdb_track.c index 9aa1b30..773d0e2 100644 --- a/src/itdb_track.c +++ b/src/itdb_track.c @@ -1,4 +1,4 @@ -/* Time-stamp: <2005-09-19 17:50:14 jcs> +/* Time-stamp: <2005-09-24 12:21:06 jcs> | | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> | Part of the gtkpod project. @@ -166,15 +166,21 @@ void itdb_track_free (Itdb_Track *track) { g_return_if_fail (track); - g_free (track->album); - g_free (track->artist); g_free (track->title); + g_free (track->artist); + g_free (track->album); g_free (track->genre); - g_free (track->comment); g_free (track->composer); + g_free (track->comment); g_free (track->filetype); g_free (track->grouping); + g_free (track->category); + g_free (track->description); + g_free (track->podcasturl); + g_free (track->podcastrss); + g_free (track->subtitle); g_free (track->ipod_path); + g_free (track->chapterdata_raw); itdb_track_free_generated_thumbnails (track); g_free (track->orig_image_filename); if (track->userdata && track->userdata_destroy) @@ -215,7 +221,6 @@ Itdb_Track *itdb_track_duplicate (Itdb_Track *tr) Itdb_Track *tr_dup; g_return_val_if_fail (tr, NULL); - g_return_val_if_fail (!tr->userdata || tr->userdata_duplicate, NULL); tr_dup = g_new0 (Itdb_Track, 1); memcpy (tr_dup, tr, sizeof (Itdb_Track)); @@ -224,18 +229,31 @@ Itdb_Track *itdb_track_duplicate (Itdb_Track *tr) tr_dup->itdb = NULL; /* copy strings */ - tr_dup->album = g_strdup (tr->album); - tr_dup->artist = g_strdup (tr->artist); tr_dup->title = g_strdup (tr->title); + tr_dup->artist = g_strdup (tr->artist); + tr_dup->album = g_strdup (tr->album); tr_dup->genre = g_strdup (tr->genre); - tr_dup->comment = g_strdup (tr->comment); tr_dup->composer = g_strdup (tr->composer); + tr_dup->comment = g_strdup (tr->comment); tr_dup->filetype = g_strdup (tr->filetype); tr_dup->grouping = g_strdup (tr->grouping); + tr_dup->category = g_strdup (tr->category); + tr_dup->description = g_strdup (tr->description); + tr_dup->podcasturl = g_strdup (tr->podcasturl); + tr_dup->podcastrss = g_strdup (tr->podcastrss); + tr_dup->subtitle = g_strdup (tr->subtitle); tr_dup->ipod_path = g_strdup (tr->ipod_path); + /* Copy chapterdata */ + if (tr->chapterdata_raw) + { + tr_dup->chapterdata_raw = g_new (gchar, tr->chapterdata_raw_length); + memcpy (tr_dup->chapterdata_raw, tr->chapterdata_raw, + tr->chapterdata_raw_length); + } + /* Copy userdata */ - if (tr->userdata) + if (tr->userdata && tr->userdata_duplicate) tr_dup->userdata = tr->userdata_duplicate (tr->userdata); return tr_dup; |