diff options
author | Todd Zullinger <tmz@pobox.com> | 2008-12-08 01:16:58 +0000 |
---|---|---|
committer | Todd Zullinger <tmz@pobox.com> | 2008-12-08 01:16:58 +0000 |
commit | 5cc45a27c170810d537b1b479573eeb45cc0de1c (patch) | |
tree | e96fded23cb316a1be5603740ce495bd62faca37 /src/itdb.h | |
parent | cbae285207ff226bdbe1a3c249a5ffa33a457bc3 (diff) | |
download | libgpod-tmz-5cc45a27c170810d537b1b479573eeb45cc0de1c.tar.gz libgpod-tmz-5cc45a27c170810d537b1b479573eeb45cc0de1c.tar.xz libgpod-tmz-5cc45a27c170810d537b1b479573eeb45cc0de1c.zip |
Update API documentation
Add new functions and missing enums, macros, and structs to the proper
places in the documentation, remove old/unused functions, and clean up
various minor issues.
git-svn-id: https://gtkpod.svn.sf.net/svnroot/gtkpod/libgpod/trunk@2159 f01d2545-417e-4e96-918e-98f8d0dbbcb6
Diffstat (limited to 'src/itdb.h')
-rw-r--r-- | src/itdb.h | 1560 |
1 files changed, 1122 insertions, 438 deletions
@@ -50,7 +50,22 @@ G_BEGIN_DECLS #define G_GNUC_INTERNAL #endif +/** + * ItdbUserDataDestroyFunc: + * @userdata: A #gpointer to user data + * + * Function called to free userdata + */ typedef void (* ItdbUserDataDestroyFunc) (gpointer userdata); + +/** + * ItdbUserDataDuplicateFunc: + * @userdata: A #gpointer to user data + * + * Function called to duplicate userdata + * + * Returns: A #gpointer + */ typedef gpointer (* ItdbUserDataDuplicateFunc) (gpointer userdata); /* public structures */ @@ -77,6 +92,38 @@ typedef struct _Itdb_Chapterdata Itdb_Chapterdata; * \* ------------------------------------------------------------ */ +/** + * Itdb_IpodGeneration: + * @ITDB_IPOD_GENERATION_UNKNOWN: Unknown iPod + * @ITDB_IPOD_GENERATION_FIRST: First Generation iPod + * @ITDB_IPOD_GENERATION_SECOND: Second Generation iPod + * @ITDB_IPOD_GENERATION_THIRD: Third Generation iPod + * @ITDB_IPOD_GENERATION_FOURTH: Fourth Generation iPod + * @ITDB_IPOD_GENERATION_PHOTO: Photo iPod + * @ITDB_IPOD_GENERATION_MOBILE: Mobile iPod + * @ITDB_IPOD_GENERATION_MINI_1: First Generation iPod Mini + * @ITDB_IPOD_GENERATION_MINI_2: Second Generation iPod Mini + * @ITDB_IPOD_GENERATION_SHUFFLE_1: First Generation iPod Shuffle + * @ITDB_IPOD_GENERATION_SHUFFLE_2: Second Generation iPod Shuffle + * @ITDB_IPOD_GENERATION_SHUFFLE_3: Third Generation iPod Shuffle + * @ITDB_IPOD_GENERATION_NANO_1: First Generation iPod Nano + * @ITDB_IPOD_GENERATION_NANO_2: Second Generation iPod Nano + * @ITDB_IPOD_GENERATION_NANO_3: Third Generation iPod Nano + * @ITDB_IPOD_GENERATION_NANO_4: Fourth Generation iPod Nano + * @ITDB_IPOD_GENERATION_VIDEO_1: First Generation iPod Video (aka 5g) + * @ITDB_IPOD_GENERATION_VIDEO_2: Second Generation iPod Video (aka 5.5g) + * @ITDB_IPOD_GENERATION_CLASSIC_1: First Generation iPod Classic + * @ITDB_IPOD_GENERATION_CLASSIC_2: Second Generation iPod Classic + * @ITDB_IPOD_GENERATION_TOUCH_1: First Generation iPod Touch + * @ITDB_IPOD_GENERATION_IPHONE_1: First Generation iPhone + * + * iPod generation information + * + * See http://support.apple.com/kb/HT1353 and http://en.wikipedia.org/wiki/IPod + * for more details. + * + * Since: 0.4.0 + */ typedef enum { ITDB_IPOD_GENERATION_UNKNOWN, ITDB_IPOD_GENERATION_FIRST, @@ -102,6 +149,50 @@ typedef enum { ITDB_IPOD_GENERATION_IPHONE_1, } Itdb_IpodGeneration; +/** + * Itdb_IpodModel: + * @ITDB_IPOD_MODEL_INVALID: Invalid model + * @ITDB_IPOD_MODEL_UNKNOWN: Unknown model + * @ITDB_IPOD_MODEL_COLOR: Color iPod + * @ITDB_IPOD_MODEL_COLOR_U2: Color iPod (U2) + * @ITDB_IPOD_MODEL_REGULAR: Regular iPod + * @ITDB_IPOD_MODEL_REGULAR_U2: Regular iPod (U2) + * @ITDB_IPOD_MODEL_MINI: iPod Mini + * @ITDB_IPOD_MODEL_MINI_BLUE: iPod Mini (Blue) + * @ITDB_IPOD_MODEL_MINI_PINK: iPod Mini (Pink) + * @ITDB_IPOD_MODEL_MINI_GREEN: iPod Mini (Green) + * @ITDB_IPOD_MODEL_MINI_GOLD: iPod Mini (Gold) + * @ITDB_IPOD_MODEL_SHUFFLE: iPod Shuffle + * @ITDB_IPOD_MODEL_NANO_WHITE: iPod Nano (White) + * @ITDB_IPOD_MODEL_NANO_BLACK: iPod Nano (Black) + * @ITDB_IPOD_MODEL_VIDEO_WHITE: iPod Video (White) + * @ITDB_IPOD_MODEL_VIDEO_BLACK: iPod Video (Black) + * @ITDB_IPOD_MODEL_MOBILE_1: Mobile iPod + * @ITDB_IPOD_MODEL_VIDEO_U2: iPod Video (U2) + * @ITDB_IPOD_MODEL_NANO_SILVER: iPod Nano (Silver) + * @ITDB_IPOD_MODEL_NANO_BLUE: iPod Nano (Blue) + * @ITDB_IPOD_MODEL_NANO_GREEN: iPod Nano (Green) + * @ITDB_IPOD_MODEL_NANO_PINK: iPod Nano (Pink) + * @ITDB_IPOD_MODEL_NANO_RED: iPod Nano (Red) + * @ITDB_IPOD_MODEL_NANO_YELLOW: iPod Nano (Yellow) + * @ITDB_IPOD_MODEL_NANO_PURPLE: iPod Nano (Purple) + * @ITDB_IPOD_MODEL_NANO_ORANGE: iPod Nano (Orange) + * @ITDB_IPOD_MODEL_IPHONE_1: iPhone + * @ITDB_IPOD_MODEL_SHUFFLE_SILVER: iPod Shuffle (Silver) + * @ITDB_IPOD_MODEL_SHUFFLE_PINK: iPod Shuffle (Pink) + * @ITDB_IPOD_MODEL_SHUFFLE_BLUE: iPod Shuffle (Blue) + * @ITDB_IPOD_MODEL_SHUFFLE_GREEN: iPod Shuffle (Green) + * @ITDB_IPOD_MODEL_SHUFFLE_ORANGE: iPod Shuffle (Orange) + * @ITDB_IPOD_MODEL_SHUFFLE_PURPLE: iPod Shuffle (Purple) + * @ITDB_IPOD_MODEL_SHUFFLE_RED: iPod Shuffle (Red) + * @ITDB_IPOD_MODEL_CLASSIC_SILVER: iPod Classic (Silver) + * @ITDB_IPOD_MODEL_CLASSIC_BLACK: iPod Classic (Black) + * @ITDB_IPOD_MODEL_TOUCH_BLACK: iPod Touch (Black) + * + * iPod model information + * + * Since: 0.4.0 + */ typedef enum { ITDB_IPOD_MODEL_INVALID, ITDB_IPOD_MODEL_UNKNOWN, @@ -142,19 +233,34 @@ typedef enum { ITDB_IPOD_MODEL_TOUCH_BLACK, } Itdb_IpodModel; +/** + * Itdb_IpodInfo: + * @model_number: The model number. This is abbreviated. If the first + * character is not numeric, it is ommited. e.g. + * "MA350 -> A350", "M9829 -> 9829" + * @capacity: The iPod's capacity in gigabytes + * @ipod_model: The iPod model + * @ipod_generation: The iPod generation + * @musicdirs: The number of music (Fnn) dirs created by iTunes. The + * exact number seems to be version dependent. Therefore, the + * numbers here represent a mixture of reported values and + * common sense. Note: this number does not necessarily + * represent the number of dirs present on a particular iPod. + * It is used when setting up a new iPod from scratch. + * @reserved_int1: Reserved for future use + * @reserved_int2: Reserved for future use + * @reserved1: Reserved for future use + * @reserved2: Reserved for future use + * + * Structure representing information about an iPod + * + * Since: 0.4.0 + */ struct _Itdb_IpodInfo { - /* model_number is abbreviated: if the first character is not - numeric, it is ommited. e.g. "MA350 -> A350", "M9829 -> 9829" */ const gchar *model_number; - const double capacity; /* in GB */ + const double capacity; const Itdb_IpodModel ipod_model; const Itdb_IpodGeneration ipod_generation; - /* Number of music (Fnn) dirs created by iTunes. The exact number - seems to be version dependent. Therefore, the numbers here - represent a mixture of reported values and common sense. Note: - this number does not necessarily represent the number of dirs - present on a particular iPod. It is used when setting up a new - iPod from scratch. */ const guint musicdirs; /* reserved for future use */ const gint32 reserved_int1; @@ -177,17 +283,51 @@ struct _Itdb_IpodInfo { copy. Further, all enums and #defines below, Itdb_SPLRule, Itdb_SPLRules, and Itdb_SPLPref may also be used under a FreeBSD license. */ +/** + * ITDB_SPL_STRING_MAXLEN: + * + * Maximum string length for smart playlists + * + * Since: 0.5.0 + */ #define ITDB_SPL_STRING_MAXLEN 255 + +/** + * ITDB_SPL_DATE_IDENTIFIER: + * + * Identifier for smart playlist date fields + * + * Since: 0.5.0 + */ #define ITDB_SPL_DATE_IDENTIFIER (G_GINT64_CONSTANT (0x2dae2dae2dae2daeU)) /* Definitions for smart playlists */ -typedef enum { /* types for match_operator */ - ITDB_SPLMATCH_AND = 0, /* AND rule - all of the rules must be true in - order for the combined rule to be applied */ - ITDB_SPLMATCH_OR = 1 /* OR rule */ + +/** + * ItdbSPLMatch: + * @ITDB_SPLMATCH_AND: Logical AND - all of the rules must be true in order for + * the combined rule to be applied + * @ITDB_SPLMATCH_OR: Logical OR - any of the rules may be true + * + * Types for smart playlist rules match_operator + */ +typedef enum { + ITDB_SPLMATCH_AND = 0, + ITDB_SPLMATCH_OR = 1 } ItdbSPLMatch; -/* Limit Types.. like limit playlist to 100 minutes or to 100 songs */ +/** + * ItdbLimitType: + * @ITDB_LIMITTYPE_MINUTES: Limit in minutes + * @ITDB_LIMITTYPE_MB: Limit in megabytes + * @ITDB_LIMITTYPE_SONGS: Limit in number of songs + * @ITDB_LIMITTYPE_HOURS: Limit in hours + * @ITDB_LIMITTYPE_GB: Limit in gigabytes + * + * The type of unit to use when limiting a playlist + * + * Since: 0.5.0 + */ typedef enum { ITDB_LIMITTYPE_MINUTES = 0x01, ITDB_LIMITTYPE_MB = 0x02, @@ -196,19 +336,39 @@ typedef enum { ITDB_LIMITTYPE_GB = 0x05 } ItdbLimitType; -/* Limit Sorts.. Like which songs to pick when using a limit type - Special note: the values for ITDB_LIMITSORT_LEAST_RECENTLY_ADDED, - ITDB_LIMITSORT_LEAST_OFTEN_PLAYED, ITDB_LIMITSORT_LEAST_RECENTLY_PLAYED, and - ITDB_LIMITSORT_LOWEST_RATING are really 0x10, 0x14, 0x15, 0x17, with the - 'limitsort_opposite' flag set. This is the same value as the - "positive" value (i.e. ITDB_LIMITSORT_LEAST_RECENTLY_ADDED), and is - really very terribly awfully weird, so we map the values to iPodDB - specific values with the high bit set. - - On writing, we check the high bit and write the limitsort_opposite - from that. That way, we don't have to deal with programs using the - class needing to set the wrong limit and then make it into the - "opposite", which would be frickin' annoying. */ +/** + * ItdbLimitSort: + * @ITDB_LIMITSORT_RANDOM: Sort randomly + * @ITDB_LIMITSORT_SONG_NAME: Sort by track name + * @ITDB_LIMITSORT_ALBUM: Sort by album name + * @ITDB_LIMITSORT_ARTIST: Sort by artist name + * @ITDB_LIMITSORT_GENRE: Sort by genre + * @ITDB_LIMITSORT_MOST_RECENTLY_ADDED: Sort by most recently added + * @ITDB_LIMITSORT_LEAST_RECENTLY_ADDED: Sort by least recently added + * @ITDB_LIMITSORT_MOST_OFTEN_PLAYED: Sort by most often played + * @ITDB_LIMITSORT_LEAST_OFTEN_PLAYED: Sort by least often played + * @ITDB_LIMITSORT_MOST_RECENTLY_PLAYED: Sort by most recently played + * @ITDB_LIMITSORT_LEAST_RECENTLY_PLAYED: Sort by least recently played + * @ITDB_LIMITSORT_HIGHEST_RATING: Sort by highest rating + * @ITDB_LIMITSORT_LOWEST_RATING: Sort by lowest rating + * + * Which songs to pick when using a limit type + * + * Note: the values for #ITDB_LIMITSORT_LEAST_RECENTLY_ADDED, + * #ITDB_LIMITSORT_LEAST_OFTEN_PLAYED, #ITDB_LIMITSORT_LEAST_RECENTLY_PLAYED, + * and #ITDB_LIMITSORT_LOWEST_RATING are really 0x10, 0x14, 0x15, 0x17, with the + * 'limitsort_opposite' flag set. This is the same value as the "positive" + * value (i.e. #ITDB_LIMITSORT_LEAST_RECENTLY_ADDED), and is really very + * terribly awfully weird, so we map the values to iPodDB specific values with + * the high bit set. + * + * On writing, we check the high bit and write the limitsort_opposite from that. + * That way, we don't have to deal with programs using the class needing to set + * the wrong limit and then make it into the "opposite", which would be frickin' + * annoying. + * + * Since: 0.5.0 + */ typedef enum { ITDB_LIMITSORT_RANDOM = 0x02, ITDB_LIMITSORT_SONG_NAME = 0x03, @@ -225,28 +385,57 @@ typedef enum { ITDB_LIMITSORT_LOWEST_RATING = 0x80000017, /* See note above */ } ItdbLimitSort; -/* Smartlist Actions - Used in the rules. -Note by Otto (Samuel Wood): - really this is a bitmapped field... - high byte - bit 0 = "string" values if set, "int" values if not set - bit 1 = "not", or to negate the check. - lower 2 bytes - bit 0 = simple "IS" query - bit 1 = contains - bit 2 = begins with - bit 3 = ends with - bit 4 = greater than - bit 5 = unknown, but probably greater than or equal to - bit 6 = less than - bit 7 = unknown, but probably less than or equal to - bit 8 = a range selection - bit 9 = "in the last" +/** + * ItdbSPLAction: + * @ITDB_SPLACTION_IS_INT: is integer ("Is Set" in iTunes) + * @ITDB_SPLACTION_IS_GREATER_THAN: is greater than ("Is after" in iTunes) + * @ITDB_SPLACTION_IS_LESS_THAN: is less than ("Is Before" in iTunes) + * @ITDB_SPLACTION_IS_IN_THE_RANGE: is in the range + * @ITDB_SPLACTION_IS_IN_THE_LAST: is in the last + * @ITDB_SPLACTION_BINARY_AND: binary AND + * @ITDB_SPLACTION_IS_STRING: is a string + * @ITDB_SPLACTION_CONTAINS: contains + * @ITDB_SPLACTION_STARTS_WITH: starts with + * @ITDB_SPLACTION_ENDS_WITH: ends with + * @ITDB_SPLACTION_IS_NOT_INT: is not an integer ("Is Not Set" in iTunes) + * @ITDB_SPLACTION_IS_NOT_GREATER_THAN: is not greater than (not in iTunes) + * @ITDB_SPLACTION_IS_NOT_LESS_THAN: is not less than (not in iTunes) + * @ITDB_SPLACTION_IS_NOT_IN_THE_RANGE: is not in the range (not in iTunes) + * @ITDB_SPLACTION_IS_NOT_IN_THE_LAST: is not in the last + * @ITDB_SPLACTION_IS_NOT: is not + * @ITDB_SPLACTION_DOES_NOT_CONTAIN: does not contain + * @ITDB_SPLACTION_DOES_NOT_START_WITH: does not start with (not in iTunes) + * @ITDB_SPLACTION_DOES_NOT_END_WITH: does not end with (not in iTunes) + * + * Smartlist Actions used in smart playlist rules. + * + * Note by Otto (Samuel Wood): + * <informalexample> + * <programlisting> + * really this is a bitmapped field... + * high byte + * bit 0 = "string" values if set, "int" values if not set + * bit 1 = "not", or to negate the check. + * lower 2 bytes + * bit 0 = simple "IS" query + * bit 1 = contains + * bit 2 = begins with + * bit 3 = ends with + * bit 4 = greater than + * bit 5 = unknown, but probably greater than or equal to + * bit 6 = less than + * bit 7 = unknown, but probably less than or equal to + * bit 8 = a range selection + * bit 9 = "in the last" + * </programlisting> + * </informalexample> + * + * Since: 0.5.0 */ typedef enum { - ITDB_SPLACTION_IS_INT = 0x00000001, /* "Is Set" in iTunes */ - ITDB_SPLACTION_IS_GREATER_THAN = 0x00000010, /* "Is After" in iTunes */ - ITDB_SPLACTION_IS_LESS_THAN = 0x00000040, /* "Is Before" in iTunes */ + ITDB_SPLACTION_IS_INT = 0x00000001, + ITDB_SPLACTION_IS_GREATER_THAN = 0x00000010, + ITDB_SPLACTION_IS_LESS_THAN = 0x00000040, ITDB_SPLACTION_IS_IN_THE_RANGE = 0x00000100, ITDB_SPLACTION_IS_IN_THE_LAST = 0x00000200, ITDB_SPLACTION_BINARY_AND = 0x00000400, @@ -256,25 +445,32 @@ typedef enum { ITDB_SPLACTION_STARTS_WITH = 0x01000004, ITDB_SPLACTION_ENDS_WITH = 0x01000008, - ITDB_SPLACTION_IS_NOT_INT = 0x02000001, /* "Is Not Set" in iTunes */ - - /* Note: Not available in iTunes 4.5 (untested on iPod) */ + ITDB_SPLACTION_IS_NOT_INT = 0x02000001, ITDB_SPLACTION_IS_NOT_GREATER_THAN = 0x02000010, - /* Note: Not available in iTunes 4.5 (untested on iPod) */ ITDB_SPLACTION_IS_NOT_LESS_THAN = 0x02000040, - /* Note: Not available in iTunes 4.5 (seems to work on iPod) */ ITDB_SPLACTION_IS_NOT_IN_THE_RANGE = 0x02000100, - ITDB_SPLACTION_IS_NOT_IN_THE_LAST = 0x02000200, + ITDB_SPLACTION_IS_NOT = 0x03000001, ITDB_SPLACTION_DOES_NOT_CONTAIN = 0x03000002, - - /* Note: Not available in iTunes 4.5 (seems to work on iPod) */ ITDB_SPLACTION_DOES_NOT_START_WITH = 0x03000004, - /* Note: Not available in iTunes 4.5 (seems to work on iPod) */ ITDB_SPLACTION_DOES_NOT_END_WITH = 0x03000008, } ItdbSPLAction; +/** + * ItdbSPLFieldType: + * @ITDB_SPLFT_STRING: string + * @ITDB_SPLFT_INT: integer + * @ITDB_SPLFT_BOOLEAN: boolean + * @ITDB_SPLFT_DATE: date + * @ITDB_SPLFT_PLAYLIST: playlist + * @ITDB_SPLFT_UNKNOWN: unknown + * @ITDB_SPLFT_BINARY_AND: binary AND + * + * Smart Playlist Field Types + * + * Since: 0.5.0 + */ typedef enum { ITDB_SPLFT_STRING = 1, @@ -286,6 +482,24 @@ typedef enum ITDB_SPLFT_BINARY_AND } ItdbSPLFieldType; +/** + * ItdbSPLActionType: + * @ITDB_SPLAT_STRING: string + * @ITDB_SPLAT_INT: from integer + * @ITDB_SPLAT_DATE: from date ... + * @ITDB_SPLAT_RANGE_INT: an integer range ... + * @ITDB_SPLAT_RANGE_DATE: a date range ... + * @ITDB_SPLAT_INTHELAST: in the last ... + * @ITDB_SPLAT_PLAYLIST: in playlist + * @ITDB_SPLAT_NONE: none + * @ITDB_SPLAT_INVALID: invalid + * @ITDB_SPLAT_UNKNOWN: unknown + * @ITDB_SPLAT_BINARY_AND: is / is not (binary AND) + * + * Smart Playlist Action Types + * + * Since: 0.5.0 + */ typedef enum { ITDB_SPLAT_STRING = 1, @@ -302,14 +516,23 @@ typedef enum } ItdbSPLActionType; -/* These are to pass to AddRule() when you need a unit for the two "in - the last" action types Or, in theory, you can use any time - range... iTunes might not like it, but the iPod shouldn't care. */ +/** + * ItdbSPLActionLast: + * @ITDB_SPLACTION_LAST_DAYS_VALUE: Seconds in 24 hours + * @ITDB_SPLACTION_LAST_WEEKS_VALUE: Seconds in 7 days + * @ITDB_SPLACTION_LAST_MONTHS_VALUE: Seconds in 1 month (approximately) + * + * These are to pass to AddRule() when you need a unit for the two "in the last" + * action types. In theory, you can use any time range. iTunes might not + * like it, but the iPod shouldn't care. + * + * Since: 0.5.0 + */ typedef enum { ITDB_SPLACTION_LAST_DAYS_VALUE = 86400, /* nr of secs in 24 hours */ ITDB_SPLACTION_LAST_WEEKS_VALUE = 604800, /* nr of secs in 7 days */ ITDB_SPLACTION_LAST_MONTHS_VALUE = 2628000,/* nr of secs in 30.4167 - days ~= 1 month */ + days ~= 1 month */ } ItdbSPLActionLast; #if 0 @@ -331,84 +554,161 @@ typedef enum { #define ITDB_SPLACTION_LAST_SIDEREAL_YEAR 31558150 // a "sidereal year" is the time it takes the earth to reach the same point in space again, compared to the stars #endif -/* Smartlist fields - Used for rules. */ +/** + * ItdbSPLField: + * @ITDB_SPLFIELD_SONG_NAME: Song name (string) + * @ITDB_SPLFIELD_ALBUM: Album (string) + * @ITDB_SPLFIELD_ARTIST: Artist (string) + * @ITDB_SPLFIELD_BITRATE: Bitrate (integer, e.g. from/to = 128) + * @ITDB_SPLFIELD_SAMPLE_RATE: Sample rate (integer, e.g. from/to = 44100) + * @ITDB_SPLFIELD_YEAR: Year (integer, e.g. from/to = 2004) + * @ITDB_SPLFIELD_GENRE: Genre (string) + * @ITDB_SPLFIELD_KIND: File type (string, e.g. MP3-File) + * @ITDB_SPLFIELD_DATE_MODIFIED: Date modified (integer, e.g. + * from/to = bcf93280 == is before 6/19/2004) + * @ITDB_SPLFIELD_TRACKNUMBER: Track number (integer, e.g. from/to = 2) + * @ITDB_SPLFIELD_SIZE: Size (integer, e.g. + * from/to = 0x00600000 for 6MB) + * @ITDB_SPLFIELD_TIME: Time (integer, e.g. + * from/to = 83999 for 1:23/83 seconds) + * @ITDB_SPLFIELD_COMMENT: Comment (string) + * @ITDB_SPLFIELD_DATE_ADDED: Date added (integer, e.g. + * from/to = bcfa83ff == is after 6/19/2004) + * @ITDB_SPLFIELD_COMPOSER: Composer (string) + * @ITDB_SPLFIELD_PLAYCOUNT: Playcount (integer, e.g. from/to = 1) + * @ITDB_SPLFIELD_LAST_PLAYED: Date last played (integer, e.g. + * from = bcfa83ff (6/19/2004) + * to = 0xbcfbd57f (6/20/2004)) + * @ITDB_SPLFIELD_DISC_NUMBER: Disc number (integer, e.g. from/to = 1) + * @ITDB_SPLFIELD_RATING: Rating (integer, e.g. + * from/to = 60 (3 stars)) + * @ITDB_SPLFIELD_COMPILATION: Compilation (integer, e.g. + * is set -> ITDB_SPLACTION_IS_INT/from=1, + * not set -> ITDB_SPLACTION_IS_NOT_INT/from=1) + * @ITDB_SPLFIELD_BPM: Beats per minute (integer, e.g. + * from/to = 60) + * @ITDB_SPLFIELD_GROUPING: Grouping (string) + * @ITDB_SPLFIELD_PLAYLIST: FIXME Unknown...not parsed correctly... + * from/to = 0xb6fbad5f for "Purchased Music". + * Extra data after "to"... + * @ITDB_SPLFIELD_VIDEO_KIND: Logical integer (works on mediatype) + * @ITDB_SPLFIELD_TVSHOW: TV Show (string) + * @ITDB_SPLFIELD_SEASON_NR: Season number (integer) + * @ITDB_SPLFIELD_SKIPCOUNT: Skipcount (integer) + * @ITDB_SPLFIELD_LAST_SKIPPED: Last skipped (integer) + * @ITDB_SPLFIELD_ALBUMARTIST: Album artist (string) + * + * Smart Playlist Fields, used for Smart Playlist Rules (#Itdb_SPLRule). + * + * Since: 0.5.0 + */ typedef enum { - ITDB_SPLFIELD_SONG_NAME = 0x02, /* String */ - ITDB_SPLFIELD_ALBUM = 0x03, /* String */ - ITDB_SPLFIELD_ARTIST = 0x04, /* String */ - ITDB_SPLFIELD_BITRATE = 0x05, /* Int (e.g. from/to = 128) */ - ITDB_SPLFIELD_SAMPLE_RATE = 0x06, /* Int (e.g. from/to = 44100) */ - ITDB_SPLFIELD_YEAR = 0x07, /* Int (e.g. from/to = 2004) */ - ITDB_SPLFIELD_GENRE = 0x08, /* String */ - ITDB_SPLFIELD_KIND = 0x09, /* String */ - ITDB_SPLFIELD_DATE_MODIFIED = 0x0a,/* Int (e.g. from/to = bcf93280 == - is before 6/19/2004)*/ - ITDB_SPLFIELD_TRACKNUMBER = 0x0b, /* Int (e.g. from = 1, to = 2) */ - ITDB_SPLFIELD_SIZE = 0x0c, /* Int (e.g. from/to = 0x00600000 - for 6MB) */ - ITDB_SPLFIELD_TIME = 0x0d, /* Int (e.g. from/to = 83999 for - 1:23/83 seconds) */ - ITDB_SPLFIELD_COMMENT = 0x0e, /* String */ - ITDB_SPLFIELD_DATE_ADDED = 0x10, /* Int (e.g. from/to = bcfa83ff == - is after 6/19/2004) */ - ITDB_SPLFIELD_COMPOSER = 0x12, /* String */ - ITDB_SPLFIELD_PLAYCOUNT = 0x16, /* Int (e.g. from/to = 1) */ - ITDB_SPLFIELD_LAST_PLAYED = 0x17, /* Int/ (e.g. from = bcfa83ff (6/19/2004) - to = 0xbcfbd57f (6/20/2004)) */ - ITDB_SPLFIELD_DISC_NUMBER = 0x18, /* Int (e.g. from/to = 1) */ - ITDB_SPLFIELD_RATING = 0x19, /* Int/Stars Rating (e.g. from/to = - 60 (3 stars)) */ - ITDB_SPLFIELD_COMPILATION = 0x1f, /* Int (e.g. is set -> - ITDB_SPLACTION_IS_INT/from=1, - is not set -> - ITDB_SPLACTION_IS_NOT_INT/from=1) */ - ITDB_SPLFIELD_BPM = 0x23, /* Int (e.g. from/to = 60) */ - ITDB_SPLFIELD_GROUPING = 0x27, /* String */ - ITDB_SPLFIELD_PLAYLIST = 0x28, /* FIXME - Unknown...not parsed - correctly...from/to = 0xb6fbad5f - for "Purchased Music". Extra - data after "to"... */ - ITDB_SPLFIELD_VIDEO_KIND = 0x3c, /* Logic Int */ - ITDB_SPLFIELD_TVSHOW = 0x3e, /* String */ - ITDB_SPLFIELD_SEASON_NR = 0x3f, /* Int */ - ITDB_SPLFIELD_SKIPCOUNT = 0x44, /* Int */ - ITDB_SPLFIELD_LAST_SKIPPED = 0x45, /* Int */ - ITDB_SPLFIELD_ALBUMARTIST = 0x47 /* String */ + ITDB_SPLFIELD_SONG_NAME = 0x02, + ITDB_SPLFIELD_ALBUM = 0x03, + ITDB_SPLFIELD_ARTIST = 0x04, + ITDB_SPLFIELD_BITRATE = 0x05, + ITDB_SPLFIELD_SAMPLE_RATE = 0x06, + ITDB_SPLFIELD_YEAR = 0x07, + ITDB_SPLFIELD_GENRE = 0x08, + ITDB_SPLFIELD_KIND = 0x09, + ITDB_SPLFIELD_DATE_MODIFIED = 0x0a, + ITDB_SPLFIELD_TRACKNUMBER = 0x0b, + ITDB_SPLFIELD_SIZE = 0x0c, + ITDB_SPLFIELD_TIME = 0x0d, + ITDB_SPLFIELD_COMMENT = 0x0e, + ITDB_SPLFIELD_DATE_ADDED = 0x10, + ITDB_SPLFIELD_COMPOSER = 0x12, + ITDB_SPLFIELD_PLAYCOUNT = 0x16, + ITDB_SPLFIELD_LAST_PLAYED = 0x17, + ITDB_SPLFIELD_DISC_NUMBER = 0x18, + ITDB_SPLFIELD_RATING = 0x19, + ITDB_SPLFIELD_COMPILATION = 0x1f, + ITDB_SPLFIELD_BPM = 0x23, + ITDB_SPLFIELD_GROUPING = 0x27, + ITDB_SPLFIELD_PLAYLIST = 0x28, + ITDB_SPLFIELD_VIDEO_KIND = 0x3c, + ITDB_SPLFIELD_TVSHOW = 0x3e, + ITDB_SPLFIELD_SEASON_NR = 0x3f, + ITDB_SPLFIELD_SKIPCOUNT = 0x44, + ITDB_SPLFIELD_LAST_SKIPPED = 0x45, + ITDB_SPLFIELD_ALBUMARTIST = 0x47 } ItdbSPLField; +/** + * Itdb_SPLPref: + * @liveupdate: Live Updating + * @checkrules: Match this number of rules. If set to 0, ignore rules. + * @checklimits: Limit to this number of @limittype. If 0, no limits. + * @limittype: an #ItdbLimitType + * @limitsort: an #ItdbLimitSort + * @limitvalue: The value typed next to "Limit type" + * @matchcheckedonly: Match only checked songs + * @reserved_int1: Reserved for future use + * @reserved_int2: Reserved for future use + * @reserved1: Reserved for future use + * @reserved2: Reserved for future use + * + * Smart Playlist preferences are for various flags that are not strictly smart + * playlist "rules." + * + * Since: 0.5.0 + */ struct _Itdb_SPLPref { - guint8 liveupdate; /* "live Updating" check box */ - guint8 checkrules; /* "Match X of the following - conditions" check box */ - guint8 checklimits; /* "Limit To..." check box */ - guint32 limittype; /* See types defined above */ - guint32 limitsort; /* See types defined above */ - guint32 limitvalue; /* The value typed next to "Limit - type" */ - guint8 matchcheckedonly; /* "Match only checked songs" check box */ - /* reserved for future use */ + guint8 liveupdate; + guint8 checkrules; + guint8 checklimits; + guint32 limittype; + guint32 limitsort; + guint32 limitvalue; + guint8 matchcheckedonly; gint32 reserved_int1; gint32 reserved_int2; gpointer reserved1; gpointer reserved2; }; +/** + * Itdb_SPLRule: + * @field: an #ItdbSPLFieldType + * @action: an #ItdbSPLActionType + * @string: data in UTF8 + * @fromvalue: from value + * @fromdate: from date + * @fromunits: from units + * @tovalue: to value + * @todate: to date + * @tounits: to units + * @unk052: Unknown + * @unk056: Unknown + * @unk060: Unknown + * @unk064: Unknown + * @unk068: Unknown + * @reserved_int1: Reserved for future use + * @reserved_int2: Reserved for future use + * @reserved1: Reserved for future use + * @reserved2: Reserved for future use + * + * Smart Playlist Rule + * + * The from and to fields require some explanation. If @field is a date type, + * then @value would be set to 0x2dae2dae2dae2dae, @date would be a number, + * (e.g. 2 or -2), and @units would be a time unit in seconds (e.g. one week + * would be 604800). If @field is an integer comparison, like rating = 60 (i.e. + * 3 stars), then @value would be the value we care about (e.g. 60), @date would + * be 0, and @units would be 1. Binary AND types are similar, @value is the + * important part, with @date = 0 and @units = 1. Clear as mud, right? + * + * For more details see <ulink + * url="http://ipodlinux.org/ITunesDB.html#Smart_Playlist_Rule_Values">ipodlinux.org</ulink>. + * + * Since: 0.5.0 + */ struct _Itdb_SPLRule { guint32 field; guint32 action; - gchar *string; /* data in UTF8 */ - /* from and to are pretty stupid.. if it's a date type of field, - then - value = 0x2dae2dae2dae2dae, - date = some number, like 2 or -2 - units = unit in seconds, like 604800 = a week - but if this is actually some kind of integer comparison, like - rating = 60 (3 stars) - value = the value we care about - date = 0 - units = 1 */ + gchar *string; guint64 fromvalue; gint64 fromdate; guint64 fromunits; @@ -427,12 +727,25 @@ struct _Itdb_SPLRule gpointer reserved2; }; - +/** + * Itdb_SPLRules: + * @unk004: Unknown + * @match_operator: Whether all rules must match (#ITDB_SPLMATCH_AND) or any + * rules may match (#ITDB_SPLMATCH_OR) + * @rules: list of #Itdb_SPLRule's + * @reserved_int1: Reserved for future use + * @reserved_int2: Reserved for future use + * @reserved1: Reserved for future use + * @reserved2: Reserved for future use + * + * Smart Playlist Rules + * + * Since: 0.5.0 + */ struct _Itdb_SPLRules { guint32 unk004; - guint32 match_operator; /* "All" (logical AND): Itdb_SPLMATCH_AND, - "Any" (logical OR): Itdb_SPLMATCH_OR */ + guint32 match_operator; GList *rules; /* reserved for future use */ gint32 reserved_int1; @@ -448,10 +761,24 @@ struct _Itdb_SPLRules * \* ------------------------------------------------------------ */ +/** + * Itdb_Chapter: + * @startpos: The start position of the chapter in ms. The first chapter + * begins at 1. + * @chaptertitle: The chapter title in UTF8 + * @reserved_int1: Reserved for future use + * @reserved_int2: Reserved for future use + * @reserved1: Reserved for future use + * @reserved2: Reserved for future use + * + * Structure representing an iTunesDB Chapter + * + * Since: 0.7.0 + */ struct _Itdb_Chapter { guint32 startpos; - gchar *chaptertitle; /* data in UTF8 */ + gchar *chaptertitle; /* reserved for future use */ gint32 reserved_int1; gint32 reserved_int2; @@ -459,7 +786,21 @@ struct _Itdb_Chapter gpointer reserved2; }; - +/** + * Itdb_Chapterdata: + * @chapters: A list of chapters (#Itdb_Chapter) + * @unk024: Unknown + * @unk028: Unknown + * @unk032: Unknown + * @reserved_int1: Reserved for future use + * @reserved_int2: Reserved for future use + * @reserved1: Reserved for future use + * @reserved2: Reserved for future use + * + * Structure representing iTunesDB Chapter data + * + * Since: 0.7.0 + */ struct _Itdb_Chapterdata { GList *chapters; @@ -480,25 +821,52 @@ struct _Itdb_Chapterdata * \* ------------------------------------------------------------ */ -/* one star is how much (track->rating) */ +/** + * ITDB_RATING_STEP: + * + * The multiplier for each star in #track->rating + */ #define ITDB_RATING_STEP 20 +/** + * Itdb_Artwork: + * @thumbnail: An #Itdb_Thumb + * @id: Artwork id used by photoalbums. This starts at 0x40 and + * is set automatically when the ArtworkDB or PhotoDB is + * written + * @dbid: The dbid of associated track. Used internally by + * libgpod. + * @unk028: Unknown + * @rating: Rating from iPhoto * 20 (PhotoDB only) + * @unk036: Unknown + * @creation_date: Date the image file was created (PhotoDB only) + * @digitized_date: Date the image was taken (EXIF information, PhotoDB + * only) + * @artwork_size: Size in bytes of the original source image (PhotoDB + * only -- don't touch in case of ArtworkDB!) + * @reserved_int1: Reserved for future use + * @reserved_int2: Reserved for future use + * @reserved1: Reserved for future use + * @reserved2: Reserved for future use + * @usertype: For use by application + * @userdata: For use by application + * @userdata_duplicate: A function to duplicate #userdata + * @userdata_destroy: A function to free #userdata + * + * Structure representing artwork in an #Itdb_iTunesDB or #Itdb_PhotoDB + * + * Since: 0.3.0 + */ struct _Itdb_Artwork { Itdb_Thumb *thumbnail; - guint32 id; /* Artwork id used by photoalbums, starts at - * 0x40... libgpod will set this on sync. */ - guint64 dbid; /* dbid of associated track. used - internally by libgpod */ + guint32 id; + guint64 dbid; gint32 unk028; - guint32 rating; /* Rating from iPhoto * 20 (PhotoDB only) */ + guint32 rating; gint32 unk036; - time_t creation_date; /* Date the image file was created - (creation date of image file (PhotoDB only) */ - time_t digitized_date;/* Date the image was taken (EXIF information, - PhotoDB only) */ - guint32 artwork_size; /* Size in bytes of the original source - image (PhotoDB only -- don't touch in - case of ArtworkDB!) */ + time_t creation_date; + time_t digitized_date; + guint32 artwork_size; /* reserved for future use */ gint32 reserved_int1; gint32 reserved_int2; @@ -512,12 +880,29 @@ struct _Itdb_Artwork { ItdbUserDataDestroyFunc userdata_destroy; }; - +/** + * Itdb_PhotoDB: + * @photos: A list of photos in the database (#Itdb_Artwork) + * @photoalbums: A list of albums in the database (#Itdb_PhotoAlbum) + * @device: iPod device info (#Itdb_Device) + * @reserved_int1: Reserved for future use + * @reserved_int2: Reserved for future use + * @reserved1: Reserved for future use + * @reserved2: Reserved for future use + * @usertype: For use by application + * @userdata: For use by application + * @userdata_duplicate: A function to duplicate #userdata + * @userdata_destroy: A function to free #userdata + * + * Structure representing an iTunes Photo database + * + * Since: 0.4.0 + */ struct _Itdb_PhotoDB { - GList *photos; /* (Itdb_Artwork *) */ - GList *photoalbums; /* (Itdb_PhotoAlbum *) */ - Itdb_Device *device;/* iPod device info */ + GList *photos; + GList *photoalbums; + Itdb_Device *device; /* reserved for future use */ gint32 reserved_int1; gint32 reserved_int2; @@ -531,12 +916,31 @@ struct _Itdb_PhotoDB ItdbUserDataDestroyFunc userdata_destroy; }; +/** + * Itdb_iTunesDB: + * @tracks: A list of tracks in the database (#Itdb_Track) + * @playlists: A list of playlists in the database (#Itdb_Playlist) + * @filename: The filename of the iTunesDB + * @device: iPod device info (#Itdb_Device) + * @version: The version number of the iTunesDB + * @id: A 64 bit id value for the iTunesDB + * @reserved_int1: Reserved for future use + * @reserved_int2: Reserved for future use + * @reserved1: Reserved for future use + * @reserved2: Reserved for future use + * @usertype: For use by application + * @userdata: For use by application + * @userdata_duplicate: A function to duplicate #userdata + * @userdata_destroy: A function to free #userdata + * + * Structure representing an iTunes database + */ struct _Itdb_iTunesDB { GList *tracks; GList *playlists; - gchar *filename; /* filename of iTunesDB */ - Itdb_Device *device;/* iPod device info */ + gchar *filename; + Itdb_Device *device; guint32 version; guint64 id; /* reserved for future use */ @@ -552,32 +956,62 @@ struct _Itdb_iTunesDB ItdbUserDataDestroyFunc userdata_destroy; }; +/** + * Itdb_PhotoAlbum: + * @photodb: A pointer to the #Itdb_PhotoDB (for convenience) + * @name: The name of photoalbum in UTF8 + * @members: A list of photos in album (#Itdb_Artwork) + * @album_type: The album type. 0x01 for master (Photo Library), + * 0x02 for a normal album. (4 and 5 have also been + * seen.) + * @playmusic: Play music during slideshow + * @repeat: Repeat the slideshow + * @random: Show slides in random order + * @show_titles: Show slide captions + * @transition_direction: Transition direction. 0=none, 1=left-to-right, + * 2=right-to-left, 3=top-to-bottom, 4=bottom-to-top + * @slide_duration: Slide duration in seconds + * @transition_duration: Transition duration, in milliseconds + * @song_id: The @dbid2 of a track to play during slideshow + * @unk024: Unknown, seems to be always 0 + * @unk028: Unknown, seems to be always 0 + * @unk044: Unknown, seems to always be 0 + * @unk048: Unknown, seems to always be 0 + * @album_id: The id of the album. This is set automatically when + * the PhotoDB is written. + * @prev_album_id: The id of the previous playlist. This is set + * automatically when the PhotoDB is written. + * @reserved_int1: Reserved for future use + * @reserved_int2: Reserved for future use + * @reserved1: Reserved for future use + * @reserved2: Reserved for future use + * @usertype: For use by application + * @userdata: For use by application + * @userdata_duplicate: A function to duplicate #userdata + * @userdata_destroy: A function to free #userdata + * + * Structure representing an iTunes Photo Album + * + * Since: 0.4.0 + */ struct _Itdb_PhotoAlbum { - Itdb_PhotoDB *photodb; /* database to which this album belongs */ - gchar *name; /* name of photoalbum in UTF8 */ - GList *members; /* photos in album (Itdb_Artwork *) */ - guint8 album_type; /* 0x01 for master (Photo Library), - 0x02 otherwise (sometimes 4 and 5) */ - guint8 playmusic; /* play music during slideshow (from - iPhoto setting) */ - guint8 repeat; /* repeat the slideshow (from iPhoto - setting) */ - guint8 random; /* show the slides in random order - (from iPhoto setting) */ - guint8 show_titles; /* show slide captions (from iPhoto - setting) */ - guint8 transition_direction; /* 0=none, 1=left-to-right, - 2=right-to-left, 3=top-to-bottom, - 4=bottom-to-top (from iPhoto setting) */ - gint32 slide_duration; /* in seconds (from iPhoto setting) */ - gint32 transition_duration; /* in milliseconds (from iPhoto setting) */ - gint64 song_id; /* dbid2 of track in iTunesDB to play - during slideshow (from iPhoto setting)*/ - gint32 unk024; /* unknown, seems to be always 0 */ - gint16 unk028; /* unknown, seems to be always 0 */ - gint32 unk044; /* unknown, seems to always be 0 */ - gint32 unk048; /* unknown, seems to always be 0 */ + Itdb_PhotoDB *photodb; + gchar *name; + GList *members; + guint8 album_type; + guint8 playmusic; + guint8 repeat; + guint8 random; + guint8 show_titles; + guint8 transition_direction; + gint32 slide_duration; + gint32 transition_duration; + gint64 song_id; + gint32 unk024; + gint16 unk028; + gint32 unk044; + gint32 unk048; /* set automatically at time of writing the PhotoDB */ gint32 album_id; gint32 prev_album_id; @@ -594,25 +1028,61 @@ struct _Itdb_PhotoAlbum ItdbUserDataDestroyFunc userdata_destroy; }; +/** + * Itdb_Playlist: + * @itdb: A pointer to the #Itdb_iTunesDB (for convenience) + * @name: The name of the playlist in UTF8 + * @type: The playlist type (normal or master) + * @flag1: Unknown, usually set to 0 + * @flag2: Unknown, always set to 0 + * @flag3: Unknown, always set to 0 + * @num: The number of tracks in the playlist + * @members: A list of tracks in the playlist (#Itdb_Track) + * @is_spl: True if the playlist is a smart playlist, otherwise + * false + * @timestamp: When the playlist was created + * @id: The playlist ID + * @sortorder: The playlist sort order (#ItdbPlaylistSortOrder) + * @podcastflag: This is set to 0 on normal playlists and to 1 for the + * Podcast playlist. If set to 1, the playlist will not be + * shown under 'Playlists' on the iPod, but as 'Podcasts' + * under the Music menu. The actual title of the Playlist + * does not matter. If more than one playlist is set to 1, + * they don't show up at all. + * @splpref: Smart playlist preferences (#Itdb_SPLPref) + * @splrules: Smart playlist rules (#Itdb_SPLRules) + * @reserved100: Reserved for MHOD100 implementation + * @reserved101: Reserved for MHOD100 implementation + * @reserved_int1: Reserved for future use + * @reserved_int2: Reserved for future use + * @reserved1: Reserved for future use + * @reserved2: Reserved for future use + * @usertype: For use by application + * @userdata: For use by application + * @userdata_duplicate: A function to duplicate #userdata + * @userdata_destroy: A function to free #userdata + * + * Structure representing an iTunes Playlist + */ struct _Itdb_Playlist { - Itdb_iTunesDB *itdb; /* pointer to iTunesDB (for convenience) */ - gchar *name; /* name of playlist in UTF8 */ - guint8 type; /* ITDB_PL_TYPE_NORM/_MPL */ - guint8 flag1; /* unknown, usually set to 0 */ - guint8 flag2; /* unknown, always set to 0 */ - guint8 flag3; /* unknown, always set to 0 */ - gint num; /* number of tracks in playlist */ - GList *members; /* tracks in playlist (Track *) */ - gboolean is_spl; /* smart playlist? */ - time_t timestamp; /* timestamp of playlist creation */ - guint64 id; /* playlist ID */ - guint32 sortorder; /* How to sort playlist -- see below */ - guint32 podcastflag; /* ITDB_PL_FLAG_NORM/_PODCAST */ - Itdb_SPLPref splpref; /* smart playlist prefs */ - Itdb_SPLRules splrules; /* rules for smart playlists */ - gpointer reserved100; /* reserved for MHOD100 implementation */ - gpointer reserved101; /* reserved for MHOD100 implementation */ + Itdb_iTunesDB *itdb; + gchar *name; + guint8 type; + guint8 flag1; + guint8 flag2; + guint8 flag3; + gint num; + GList *members; + gboolean is_spl; + time_t timestamp; + guint64 id; + guint32 sortorder; + guint32 podcastflag; + Itdb_SPLPref splpref; + Itdb_SPLRules splrules; + gpointer reserved100; + gpointer reserved101; /* reserved for future use */ gint32 reserved_int1; gint32 reserved_int2; @@ -627,39 +1097,39 @@ struct _Itdb_Playlist }; -/* -Playlist Sort Order - -1 - playlist order (manual sort order) -2 - ??? -3 - songtitle -4 - album -5 - artist -6 - bitrate -7 - genre -8 - kind -9 - date modified -10 - track nr -11 - size -12 - time -13 - year -14 - sample rate -15 - comment -16 - date added -17 - equalizer -18 - composer -19 - ??? -20 - play count -21 - last played -22 - disc nr -23 - my rating -24 - release date (I guess, it's the value for the "Podcasts" list) -25 - BPM -26 - grouping -27 - category -28 - description -*/ - +/** + * ItdbPlaylistSortOrder: + * @ITDB_PSO_MANUAL: Sort by playlist order (manual sort) + * @ITDB_PSO_TITLE: Sort by track title + * @ITDB_PSO_ALBUM: Sort by album + * @ITDB_PSO_ARTIST: Sort by artist + * @ITDB_PSO_BIRATE: Sort by bitrate + * @ITDB_PSO_GENRE: Sort by genre + * @ITDB_PSO_FILETYPE: Sort by filetype + * @ITDB_PSO_TIME_MODIFIED: Sort by date modified + * @ITDB_PSO_TRACK_NR: Sort by track number + * @ITDB_PSO_SIZE: Sort by track size + * @ITDB_PSO_TIME: Sort by track time + * @ITDB_PSO_YEAR: Sort by year + * @ITDB_PSO_SAMPLERATE: Sort by samplerate + * @ITDB_PSO_COMMENT: Sort by comments + * @ITDB_PSO_TIME_ADDED: Sort by date added + * @ITDB_PSO_EQUALIZER: Sort by equilizer + * @ITDB_PSO_COMPOSER: Sort by composer + * @ITDB_PSO_PLAYCOUNT: Sort by playcount + * @ITDB_PSO_TIME_PLAYED: Sort by date last played + * @ITDB_PSO_CD_NR: Sort by disc number + * @ITDB_PSO_RATING: Sort by rating + * @ITDB_PSO_RELEASE_DATE: Sort by release date + * @ITDB_PSO_BPM: Sort by beats per minute + * @ITDB_PSO_GROUPING: Sort by grouping + * @ITDB_PSO_CATEGORY: Sort by category + * @ITDB_PSO_DESCRIPTION: Sort by description + * + * Playlist Sort Order + * + * Since: 0.1.3 + */ typedef enum { ITDB_PSO_MANUAL = 1, @@ -693,7 +1163,23 @@ typedef enum } ItdbPlaylistSortOrder; -/* Mediatype definitions */ +/** + * Itdb_Mediatype: + * @ITDB_MEDIATYPE_AUDIO: Audio files + * @ITDB_MEDIATYPE_MOVIE: Movies + * @ITDB_MEDIATYPE_PODCAST: Podcasts + * @ITDB_MEDIATYPE_AUDIOBOOK: Audio books + * @ITDB_MEDIATYPE_MUSICVIDEO: Music videos + * @ITDB_MEDIATYPE_TVSHOW: TV Shows + * + * Mediatype definitions + * + * The mediatype is used to determine what menu a track appears under. For + * example, setting the mediatype to #ITDB_MEDIATYPE_PODCAST makes the track + * appear on the Podcast menu. + * + * Since: 0.5.0 + */ typedef enum { ITDB_MEDIATYPE_AUDIO = 0x0001, @@ -704,35 +1190,331 @@ typedef enum ITDB_MEDIATYPE_TVSHOW = 0x0040, } Itdb_Mediatype; -/* some of the descriptive comments below are copied verbatim from - http://ipodlinux.org/ITunesDB. - http://ipodlinux.org/ITunesDB is the best source for information - about the iTunesDB and related files. */ +/** + * Itdb_Track: + * @itdb: A pointer to the #Itdb_iTunesDB (for convenience) + * @title: The title of the track in UTF8 + * @ipod_path: The file path on the iPod. Directories are + * separated with ":" instead of "/". The path is + * relative to the iPod mountpoint. + * @album: The album name in UTF8 + * @artist: The artist name in UTF8 + * @genre: The genre in UTF8 + * @filetype: A UTF8 string describing the file type. E.g. + * "MP3-File". + * @comment: A comment in UTF8 + * @category: The category ("Technology", "Music", etc.) + * where the podcast was located. (Added in + * dbversion 0x0d) + * @composer: The composer name in UTF8 + * @grouping: ??? (UTF8) + * @description: Description text (such as podcast show notes). + * (Added in dbversion 0x0d) + * @podcasturl: Podcast Enclosure URL in UTF-8 or ASCII. + * (Added in dbversion 0x0d) + * @podcastrss: Podcast RSS URL in UTF-8 or ASCII. + * (Added in dbversion 0x0d) + * @chapterdata: This is an m4a-style entry that is used to + * display subsongs within a mhit. (Added in + * dbversion 0x0d) + * @subtitle: Subtitle (usually the same as Description). + * (Added in dbversion 0x0d) + * @tvshow: Name of the TV show (only used for TV Shows). + * (Added in dbversion 0x0d?) (Since libgpod-0.4.2) + * @tvepisode: The episode number (only used for TV Shows). + * (Added in dbversion 0x0d?) (Since libgpod-0.4.2) + * @tvnetwork: The TV network (only used for TV Shows). + * (Added in dbversion 0x0d?) (Since libgpod-0.4.2) + * @albumartist: The album artist (Added in dbversion 0x13?) + * (Since libgpod-0.4.2) + * @keywords: List of keywords pertaining to the track. + * (Added in dbversion 0x13?) (Since libgpod-0.4.2) + * @sort_artist: The artist name used for sorting. Artists with + * names like "The Artist" would have "Artist, + * The" here. If you do not set this field, + * libgpod will pre-sort the lists displayed by + * the iPod according to "Artist, The", without + * setting this field. + * (Added in dbversion 0x13?) (Since libgpod-0.5.0) + * @sort_title: The track title used for sorting. See + * @sort_artist. (Since libgpod-0.5.0) + * @sort_album: The album name used for sorting. See + * @sort_artist. (Since libgpod-0.5.0) + * @sort_albumartist: The album artist used for sorting. See + * @sort_artist. (Since libgpod-0.5.0) + * @sort_composer: The composer used for sorting. See + * @sort_artist. (Since libgpod-0.5.0) + * @sort_tvshow: The name of the TV show used for sorting. See + * @sort_artist. (Since libgpod-0.5.0) + * @id: Unique ID of track + * @size: The size of the file in bytes + * @tracklen: The length of the track in ms + * @cd_nr: The CD number the track comes from. + * @cds: The total number of CDs. + * @track_nr: The track number. + * @tracks: The total number of tracks. + * @bitrate: The bitrate at which the file is encoded. + * @samplerate: The samplerate of the track (e.g. CD = 44100) + * @samplerate_low: In the iTunesDB the samplerate is + * multiplied by 0x10000 -- these are the + * lower 16 bit, which are usually 0 + * @year: The year the track was released + * @volume: Volume adjustment field. This is a value from + * -255 to 255 that will be applied to the track + * on playback. + * @soundcheck: The SoundCheck value to apply to the song, when + * SoundCheck is switched on in the iPod settings. + * The value for this field can be determined by + * the equation: X = 1000 * 10 ^ (-.1 * Y) where Y + * is the adjustment value in dB and X is the + * value that goes into the SoundCheck field. The + * value 0 is special, the equation is not used + * and it is treated as "no Soundcheck" (basically + * the same as the value 1000). This equation + * works perfectly well with ReplayGain derived + * data instead of the iTunes SoundCheck derived + * information. + * @time_added: The time the track was added. + * @time_modified: The time the track was last modified + * @time_played: The time the track was last played + * @bookmark_time: The time, in milliseconds, that the track will + * start playing at. This is used for AudioBook + * filetypes (.aa and .m4b). Note that there is + * also a bookmark value in the play counts file + * that will be set by the iPod and can be used + * instead of this value. + * @rating: The track rating (stars * #ITDB_RATING_STEP) + * @playcount: The number of times the track has been played + * @playcount2: This also stores the play count of the + * track. It is unclear if this ever differs + * from the above value. During sync, this is set + * to the same value as @playcount. + * @recent_playcount: The number of times the track was played since + * the last sync. + * @transferred: Whether the file been transferred to iPod. + * @BPM: BPM (beats per minute) of the track + * @app_rating: The last rating set by an application (e.g. + * iTunes). If the rating on the iPod and the + * @rating field above differ, the original + * rating is copied here and the new rating is + * stored in @rating. + * @type1: CBR MP3s and AAC are 0x00, VBR MP3s are 0x01 + * @type2: MP3s are 0x01, AAC are 0x00 + * @compilation: Flag to mark the track as a compilation. True + * if set to 0x1, false if set to 0x0. + * @starttime: The time, in milliseconds, at which the song + * will start playing. + * @stoptime: The time, in milliseconds, at which the song + * will stop playing. + * @checked: Flag for whether the track is checked. True if + * set to 0x0, false if set to 0x1 + * @dbid: Unique database ID that identifies this song + * across the databases on the iPod. For example, + * this id joins an iTunesDB mhit with an + * ArtworkDB mhii. + * @drm_userid: Apple Store/Audible User ID (for DRM'ed files + * only, set to 0 otherwise). + * @visible: If this value is 1, the song is visible on the + * iPod. All other values cause the file to be + * hidden. + * @filetype_marker: This appears to always be 0 on hard drive based + * iPods, but for the iTunesDB that is written to + * an iPod Shuffle, iTunes 4.7.1 writes out the + * file's type as an ANSI string(!). For example, + * a MP3 file has a filetype of 0x4d503320 -> + * 0x4d = 'M', 0x50 = 'P', 0x33 = '3', 0x20 = + * <space>. This is set to the filename + * extension by libgpod when copying the track to + * the iPod. + * @artwork_count: The number of album artwork items associated + * with this song. libgpod updates this value + * when syncing. + * @artwork_size: The total size of artwork (in bytes) attached + * to this song, when it is converted to JPEG + * format. Observed in dbversion 0x0b and with + * an iPod Photo. libgpod updates this value when + * syncing. + * @samplerate2: The sample rate of the song expressed as an + * IEEE 32 bit floating point number. It is + * uncertain why this is here. libgpod will set + * this when adding a track. + * @unk126: Unknown, but always seems to be 0xffff for + * MP3/AAC songs, 0x0 for uncompressed songs + * (like WAVE format), 0x1 for Audible. libgpod + * will try to set this when adding a new track. + * @unk132: Unknown + * @time_released: The date/time the track was added to the iTunes + * music store? For podcasts this is the release + * date that is displayed next to the title in the + * Podcast playlist. + * @unk144: Unknown, but MP3 songs appear to be always + * 0x000c, AAC songs are always 0x0033, Audible + * files are 0x0029, WAV files are 0x0. libgpod + * will attempt to set this value when adding a + * track. + * @explicit_flag: Flag to mark a track as "explicit" in iTunes. + * True if to 0x1, false if set to 0x0. + * @unk148: Unknown - used for Apple Store DRM songs + * (always 0x01010100?), zero otherwise + * @unk152: Unknown + * @skipcount: The number of times the track has been skipped. + * (Added in dbversion 0x0c) + * @recent_skipcount: The number of times the track was skipped since + * the last sync. + * @last_skipped: The time the track was last skipped. (Added in + * dbversion 0x0c) + * @has_artwork: Whether the track has artwork. + * True if set to 0x01, false if set to 0x02. + * @skip_when_shuffling: Flag to skip the track when shuffling. True if + * set to 0x01, false if set to 0x00. Audiobooks + * (.aa and .m4b) always seem to be skipped when + * shuffling, regardless of this flag. + * @remember_playback_position: Flag to remember playback position. + * True when set to 0x01, false when set to 0x00. + * Audiobooks (.aa and .m4b) always seem to + * remember the playback position, regardless of + * this flag. + * @flag4: Used for podcasts, 0x00 otherwise. If set to + * 0x01 the "Now Playing" page will show + * Title/Album, when set to 0x00 it will also show + * the Artist. When set to 0x02 a sub-page + * (middle button) with further information about + * the track will be shown. + * @dbid2: The purpose of the field is unclear. If not + * set, libgpod will set this to the same value as + * @dbid when adding a track. (With iTunes, since + * dbversion 0x12, this field value differs from + * @dbid.) + * @lyrics_flag: Whether the track has lyrics (e.g. it has a + * USLT ID3 tag in an MP3 or a @lyr atom in an + * MP4). True if set to 0x01, false if set to + * 0x00. + * @movie_flag: Whether the track is a movie. True if set to + * 0x01, false if set to 0x00. + * @mark_unplayed: A value of 0x02 marks a podcast as unplayed on + * the iPod, with a bullet. Once played it is set + * to 0x01. Non-podcasts have this set to 0x01. + * (Added in dbversion 0x0c) + * @unk179: Unknown, always 0x00 so far. (Added in + * dbversion 0x0c) + * @unk180: Unknown. (Added in dbversion 0x0c) + * @pregap: The number of samples of silence before the + * track starts (for gapless playback). + * @samplecount: The number of samples in the track (for gapless + * playback). + * @unk196: Unknown. (Added in dbversion 0x0c) + * @postgap: The number of samples of silence at the end of + * the track (for gapless playback). + * @unk204: Unknown. Appears to be 0x1 for files encoded + * using the MP3 encoder, 0x0 otherwise. (Added + * in dbversion 0x0c, first values observed in + * 0x0d.) + * @mediatype: The type of file. It must be set to 0x00000001 + * for audio files, and set to 0x00000002 for + * video files. If set to 0x00, the files show up + * in both, the audio menus ("Songs", "Artists", + * etc.) and the video menus ("Movies", "Music + * Videos", etc.). It appears to be set to 0x20 + * for music videos, and if set to 0x60 the file + * shows up in "TV Shows" rather than "Movies". + * <para> + * The following list summarizes all observed types: + * </para> + * <itemizedlist> + * <listitem>0x00 00 00 00 - Audio/Video</listitem> + * <listitem>0x00 00 00 01 - Audio</listitem> + * <listitem>0x00 00 00 02 - Video</listitem> + * <listitem>0x00 00 00 04 - Podcast</listitem> + * <listitem>0x00 00 00 06 - Video Podcast</listitem> + * <listitem>0x00 00 00 08 - Audiobook</listitem> + * <listitem>0x00 00 00 20 - Music Video</listitem> + * <listitem>0x00 00 00 40 - TV Show (shows up ONLY + * in TV Shows)</listitem> + * <listitem>0x00 00 00 60 - TV Show (shows up in + * the Music lists as well)</listitem> + * </itemizedlist> + * @season_nr: The season number of the track (only used for + * TV Shows). + * @episode_nr: The episode number of the track (only used for + * TV Shows). Although this is not displayed on + * the iPod, the episodes are sorted by episode + * number. + * @unk220: Unknown. This has something to do with + * protected files. It is set to 0x0 for + * non-protected files. + * @unk224: Unknown. (Added in dbversion 0x0c) + * @unk228: Unknown. (Added in dbversion 0x0c) + * @unk232: Unknown. (Added in dbversion 0x0c) + * @unk236: Unknown. (Added in dbversion 0x0c) + * @unk240: Unknown. (Added in dbversion 0x0c) + * @unk244: Unknown. (Added in dbversion 0x13) + * @gapless_data: The size in bytes from first Synch Frame + * (which is usually the XING frame that + * includes the LAME tag) until the 8th before + * the last frame. The gapless playback does not + * work for MP3 files if this is set to zero. For + * AAC tracks, this may be zero. (Added in + * dbversion 0x13) + * @unk252: Unknown. (Added in dbversion 0x0c) + * @gapless_track_flag: If set to 1, this track has gapless playback + * data. (Added in dbversion 0x13) + * @gapless_album_flag: If set to 1, this track does not use + * crossfading in iTunes. (Added in dbversion + * 0x13) + * @artwork: An #Itdb_Artwork for cover art + * @mhii_link: This is set to the id of the corresponding + * ArtworkDB mhii, used for sparse artwork + * support. (Since libgpod-0.7.0) + * @reserved_int1: Reserved for future use + * @reserved_int2: Reserved for future use + * @reserved_int3: Reserved for future use + * @reserved_int4: Reserved for future use + * @reserved_int5: Reserved for future use + * @reserved_int6: Reserved for future use + * @reserved1: Reserved for future use + * @reserved2: Reserved for future use + * @reserved3: Reserved for future use + * @reserved4: Reserved for future use + * @reserved5: Reserved for future use + * @reserved6: Reserved for future use + * @usertype: For use by application + * @userdata: For use by application + * @userdata_duplicate: A function to duplicate #userdata + * @userdata_destroy: A function to free #userdata + * + * Structure representing a track in an iTunesDB + * + * <note><para>When adding string fields don't forget to add them in + * itdb_track_duplicate() as well.</para></note> + * + * Many of the parameter descriptions are copied verbatim from + * http://ipodlinux.org/ITunesDB, which is the best source for information about + * the iTunesDB and related files. + */ struct _Itdb_Track { - Itdb_iTunesDB *itdb; /* pointer to iTunesDB (for convenience) */ - gchar *title; /* title (utf8) */ - gchar *ipod_path; /* name of file on iPod: uses ":" instead - of "/" and is relative to mountpoint */ - gchar *album; /* album (utf8) */ - gchar *artist; /* artist (utf8) */ - gchar *genre; /* genre (utf8) */ - gchar *filetype; /* eg. "MP3-File"...(utf8) */ - gchar *comment; /* comment (utf8) */ - gchar *category; /* Category for podcast */ - gchar *composer; /* Composer (utf8) */ - gchar *grouping; /* ? (utf8) */ - gchar *description; /* see note for MHOD_ID in itdb_itunesdb.c */ - gchar *podcasturl; /* see note for MHOD_ID in itdb_itunesdb.c */ - gchar *podcastrss; /* see note for MHOD_ID in itdb_itunesdb.c */ - Itdb_Chapterdata *chapterdata; /* see note for MHOD_ID in itdb_itunesdb.c */ - gchar *subtitle; /* see note for MHOD_ID in itdb_itunesdb.c */ -/* the following 6 are new in libgpod 0.4.2... */ - gchar *tvshow; /* see note for MHOD_ID in itdb_itunesdb.c */ - gchar *tvepisode; /* see note for MHOD_ID in itdb_itunesdb.c */ - gchar *tvnetwork; /* see note for MHOD_ID in itdb_itunesdb.c */ - gchar *albumartist; /* see note for MHOD_ID in itdb_itunesdb.c */ - gchar *keywords; /* see note for MHOD_ID in itdb_itunesdb.c */ + Itdb_iTunesDB *itdb; + gchar *title; + gchar *ipod_path; + gchar *album; + gchar *artist; + gchar *genre; + gchar *filetype; + gchar *comment; + gchar *category; + gchar *composer; + gchar *grouping; + gchar *description; + gchar *podcasturl; + gchar *podcastrss; + Itdb_Chapterdata *chapterdata; + gchar *subtitle; +/* the following 5 are new in libgpod 0.4.2... */ + gchar *tvshow; + gchar *tvepisode; + gchar *tvnetwork; + gchar *albumartist; + gchar *keywords; /* the following 6 are new in libgpod 0.5.0... */ /* You can set these strings to override the standard sortorder. When set they take precedence over the default @@ -747,199 +1529,90 @@ struct _Itdb_Track the lists displayed by the iPod according to "Artist, The", without setting the field. */ - gchar *sort_artist; /* artist (for sorting) */ - gchar *sort_title; /* title (for sorting) */ - gchar *sort_album; /* album (for sorting) */ - gchar *sort_albumartist; /* album artist (for sorting) */ - gchar *sort_composer; /* composer (for sorting) */ - gchar *sort_tvshow; /* tv show (for sorting) */ -/* new fields in libgpod 0.5.0 up to here */ - guint32 id; /* unique ID of track */ - gint32 size; /* size of file in bytes */ - gint32 tracklen; /* Length of track in ms */ - gint32 cd_nr; /* CD number */ - gint32 cds; /* number of CDs */ - gint32 track_nr; /* track number */ - gint32 tracks; /* number of tracks */ - gint32 bitrate; /* bitrate */ - guint16 samplerate; /* samplerate (CD: 44100) */ - guint16 samplerate_low; /* in the iTunesDB the samplerate is - multiplied by 0x10000 -- these are the - lower 16 bit, which are usually 0 */ - gint32 year; /* year */ - gint32 volume; /* volume adjustment */ - guint32 soundcheck; /* volume adjustment "soundcheck" */ - time_t time_added; /* time when added */ - time_t time_modified; /* time of last modification */ - time_t time_played; /* time of last play */ - guint32 bookmark_time; /* bookmark set for (AudioBook) in ms */ - guint32 rating; /* star rating (stars * RATING_STEP (20)) */ - guint32 playcount; /* number of times track was played */ - guint32 playcount2; /* Also stores the play count of the - song. Don't know if it ever differs - from the above value. During sync itdb - sets playcount2 to the same value as - playcount. */ - guint32 recent_playcount; /* times track was played since last sync */ - gboolean transferred; /* has file been transferred to iPod? */ - gint16 BPM; /* BPM (beats per minute) of this track */ - guint8 app_rating; /* star rating set by appl. (not - * iPod). If the rating set on the iPod - and the rating field above differ, the - original rating is copied here and the - new rating is stored above. */ - guint8 type1; /* CBR MP3s and AAC are 0x00, VBR MP3s are - 0x01 */ - guint8 type2; /* MP3s are 0x01, AAC are 0x00 */ + gchar *sort_artist; + gchar *sort_title; + gchar *sort_album; + gchar *sort_albumartist; + gchar *sort_composer; + gchar *sort_tvshow; +/* end of new fields in libgpod 0.5.0 */ + guint32 id; + gint32 size; + gint32 tracklen; + gint32 cd_nr; + gint32 cds; + gint32 track_nr; + gint32 tracks; + gint32 bitrate; + guint16 samplerate; + guint16 samplerate_low; + gint32 year; + gint32 volume; + guint32 soundcheck; + time_t time_added; + time_t time_modified; + time_t time_played; + guint32 bookmark_time; + guint32 rating; + guint32 playcount; + guint32 playcount2; + guint32 recent_playcount; + gboolean transferred; + gint16 BPM; + guint8 app_rating; + guint8 type1; + guint8 type2; guint8 compilation; guint32 starttime; guint32 stoptime; - guint8 checked; /* 0x0: checkmark on track is set 0x1: not set */ - guint64 dbid; /* unique database ID */ - guint32 drm_userid; /* Apple Store/Audible User ID (for DRM'ed - files only, set to 0 otherwise). */ - guint32 visible; /* If this value is 1, the song is visible - on the iPod. All other values cause - the file to be hidden. */ - guint32 filetype_marker; /* This appears to always be 0 on hard - drive based iPods, but for the - iTunesDB that is written to an iPod - Shuffle, iTunes 4.7.1 writes out the - file's type as an ANSI string(!). For - example, a MP3 file has a filetype of - 0x4d503320 -> 0x4d = 'M', 0x50 = 'P', - 0x33 = '3', 0x20 = <space>. (set to - the filename extension by itdb when - copying track to iPod) */ - guint16 artwork_count; /* The number of album artwork items - associated with this song. libgpod - updates this value when syncing */ - guint32 artwork_size; /* The total size of artwork (in bytes) - attached to this song, when it is - converted to JPEG format. Observed in - iPodDB version 0x0b and with an iPod - Photo. libgpod updates this value when - syncing */ - float samplerate2; /* The sample rate of the song expressed - as an IEEE 32 bit floating point - number. It's uncertain why this is - here. itdb will set this when adding - a track */ - - guint16 unk126; /* unknown, but always seems to be 0xffff for - MP3/AAC songs, 0x0 for uncompressed songs - (like WAVE format), 0x1 for Audible. itdb - will try to set this when adding a new track */ - guint32 unk132; /* unknown */ - time_t time_released;/* date/time added to music store? - For podcasts: release date as displayed next to the - title in the Podcast playlist */ - guint16 unk144; /* unknown, but MP3 songs appear to be always - 0x000c, AAC songs are always 0x0033, Audible - files are 0x0029, WAV files are 0x0. itdb - will attempt to set this value when adding a - track. */ - guint16 explicit_flag;/* If this flag is set to 1, the track is shown as - explicit content in iTunes. Otherwise set this flag - to 0.*/ - guint32 unk148; /* unknown - used for Apple Store DRM songs - (always 0x01010100?), zero otherwise */ - guint32 unk152; /* unknown */ - guint32 skipcount; /* Number of times the track has been skipped. - Formerly unk156 (added in dbversion 0x0c) */ - guint32 recent_skipcount; /* number of times track was skipped since - last sync */ - guint32 last_skipped;/* Date/time last skipped. Formerly unk160 - (added in dbversion 0x0c) */ - guint8 has_artwork; /* 0x01: artwork is present. 0x02: no artwork is - present for this track (used by the iPod to - decide whether to display Artwork or not) */ - guint8 skip_when_shuffling;/* "Skip when shuffling" when set to - 0x01, set to 0x00 otherwise. .m4b and .aa - files always seem to be skipped when - shuffling, however */ - guint8 remember_playback_position;/* "Remember playback position" - when set to 0x01, set to 0x00 otherwise. .m4b - and .aa files always seem to remember the - playback position, however. */ - guint8 flag4; /* Used for podcasts, 0x00 otherwise. If set to - 0x01 the "Now Playing" page will show - Title/Album, when set to 0x00 it will also - show the Artist. When set to 0x02 a sub-page - (middle button) with further information - about the track will be shown. */ - guint64 dbid2; /* not clear. if not set, itdb will set this to - the same value as dbid when adding a - track. (With iTunes, since V0x12, this field - value differs from the dbid one.) */ - guint8 lyrics_flag; /* set to 0x01 if lyrics are present in MP3 tag - ("ULST"), 0x00 otherwise */ - guint8 movie_flag; /* set to 0x01 if it's a movie file, 0x00 - otherwise */ - guint8 mark_unplayed; /* A value of 0x02 marks a podcast as unplayed - on the iPod (bullet) once played it is set to - 0x01. Non-podcasts have this set to 0x01. */ - guint8 unk179; /* unknown (always 0x00 so far) */ + guint8 checked; + guint64 dbid; + guint32 drm_userid; + guint32 visible; + guint32 filetype_marker; + guint16 artwork_count; + guint32 artwork_size; + float samplerate2; + guint16 unk126; + guint32 unk132; + time_t time_released; + guint16 unk144; + guint16 explicit_flag; + guint32 unk148; + guint32 unk152; + guint32 skipcount; + guint32 recent_skipcount; + guint32 last_skipped; + guint8 has_artwork; + guint8 skip_when_shuffling; + guint8 remember_playback_position; + guint8 flag4; + guint64 dbid2; + guint8 lyrics_flag; + guint8 movie_flag; + guint8 mark_unplayed; + guint8 unk179; guint32 unk180; - guint32 pregap; /* Number of samples of silence before the songs - starts (for gapless playback). */ - guint64 samplecount;/* Number of samples in the song. First observed - in dbversion 0x0d, and only for AAC and WAV - files (for gapless playback). */ + guint32 pregap; + guint64 samplecount; guint32 unk196; - guint32 postgap; /* Number of samples of silence at the end of - the song (for gapless playback). */ - guint32 unk204; /* unknown - added in dbversion 0x0c, first - values observed in 0x0d. Observed to be 0x0 - or 0x1. */ - guint32 mediatype; /* It seems that this field denotes the type of - the file on (e.g.) the 5g video iPod. It must - be set to 0x00000001 for audio files, and set - to 0x00000002 for video files. If set to - 0x00, the files show up in both, the audio - menus ("Songs", "Artists", etc.) and the - video menus ("Movies", "Music Videos", - etc.). It appears to be set to 0x20 for music - videos, and if set to 0x60 the file shows up - in "TV Shows" rather than "Movies". - - The following list summarizes all observed types: - - * 0x00 00 00 00 - Audio/Video - * 0x00 00 00 01 - Audio - * 0x00 00 00 02 - Video - * 0x00 00 00 04 - Podcast - * 0x00 00 00 06 - Video Podcast - * 0x00 00 00 08 - Audiobook - * 0x00 00 00 20 - Music Video - * 0x00 00 00 40 - TV Show (shows up ONLY in TV Shows - * 0x00 00 00 60 - TV Show (shows up in the - Music lists as well) */ - guint32 season_nr; /* the season number of the track, for TV shows only. */ - guint32 episode_nr; /* the episode number of the track, for TV shows - only - although not displayed on the iPod, - the episodes are sorted by episode number. */ - guint32 unk220; /* Has something to do with protected files - - set to 0x0 for non-protected files. */ + guint32 postgap; + guint32 unk204; + guint32 mediatype; + guint32 season_nr; + guint32 episode_nr; + guint32 unk220; guint32 unk224; guint32 unk228, unk232, unk236, unk240, unk244; - guint32 gapless_data;/* some magic number needed for gapless playback - (added in dbversion 0x13) It has been observed - that gapless playback does not work if this is - set to zero. This number is related to the the - filesize in bytes, but it is a couple of bytes - less than the filesize. Maybe ID3 tags - etc... taken off? */ + guint32 gapless_data; guint32 unk252; - guint16 gapless_track_flag; /* if 1, this track has gapless playback data - (added in dbversion 0x13) */ - guint16 gapless_album_flag; /* if 1, this track does not use crossfading - in iTunes (added in dbversion 0x13) */ + guint16 gapless_track_flag; + guint16 gapless_album_flag; /* This is for Cover Art support */ struct _Itdb_Artwork *artwork; - /* 200805 */ + /* This is for sparse artwork support, new in libgpod-0.7.0 */ guint32 mhii_link; /* reserved for future use */ @@ -977,13 +1650,24 @@ struct _Itdb_Track * Error codes * \* ------------------------------------------------------------ */ + +/** + * ItdbFileError: + * @ITDB_FILE_ERROR_SEEK: file corrupt: illegal seek occured + * @ITDB_FILE_ERROR_CORRUPT: file corrupt + * @ITDB_FILE_ERROR_NOTFOUND: file not found + * @ITDB_FILE_ERROR_RENAME: file could not be renamed + * @ITDB_FILE_ERROR_ITDB_CORRUPT: iTunesDB in memory corrupt + * + * Error codes for iTunesDB file + */ typedef enum { - ITDB_FILE_ERROR_SEEK, /* file corrupt: illegal seek occured */ - ITDB_FILE_ERROR_CORRUPT, /* file corrupt */ - ITDB_FILE_ERROR_NOTFOUND, /* file not found */ - ITDB_FILE_ERROR_RENAME, /* file could not be renamed */ - ITDB_FILE_ERROR_ITDB_CORRUPT /* iTunesDB in memory corrupt */ + ITDB_FILE_ERROR_SEEK, + ITDB_FILE_ERROR_CORRUPT, + ITDB_FILE_ERROR_NOTFOUND, + ITDB_FILE_ERROR_RENAME, + ITDB_FILE_ERROR_ITDB_CORRUPT } ItdbFileError; @@ -1197,9 +1881,9 @@ gpointer itdb_artwork_get_pixbuf (Itdb_Device *device, Itdb_Artwork *artwork, /* itdb_thumb_... */ Itdb_Thumb *itdb_thumb_duplicate (Itdb_Thumb *thumb); -gpointer itdb_thumb_to_pixbuf_at_size (Itdb_Device *dev, Itdb_Thumb *thumb, - gint width, gint height); -GList *itdb_thumb_to_pixbufs (Itdb_Device *dev, Itdb_Thumb *thumb); +gpointer itdb_thumb_to_pixbuf_at_size (Itdb_Device *device, Itdb_Thumb *thumb, + gint width, gint height); +GList *itdb_thumb_to_pixbufs (Itdb_Device *device, Itdb_Thumb *thumb); void itdb_thumb_free (Itdb_Thumb *thumb); /* itdb_chapterdata_... */ |