|
Packit |
29108b |
/*
|
|
Packit |
29108b |
* Copyright (C) 2005-2007 Christophe Fergeau
|
|
Packit |
29108b |
*
|
|
Packit |
29108b |
*
|
|
Packit |
29108b |
* The code contained in this file is free software; you can redistribute
|
|
Packit |
29108b |
* it and/or modify it under the terms of the GNU Lesser General Public
|
|
Packit |
29108b |
* License as published by the Free Software Foundation; either version
|
|
Packit |
29108b |
* 2.1 of the License, or (at your option) any later version.
|
|
Packit |
29108b |
*
|
|
Packit |
29108b |
* This file is distributed in the hope that it will be useful,
|
|
Packit |
29108b |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
29108b |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
29108b |
* Lesser General Public License for more details.
|
|
Packit |
29108b |
*
|
|
Packit |
29108b |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
29108b |
* License along with this code; if not, write to the Free Software
|
|
Packit |
29108b |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
Packit |
29108b |
*
|
|
Packit |
29108b |
* iTunes and iPod are trademarks of Apple
|
|
Packit |
29108b |
*
|
|
Packit |
29108b |
* This product is not supported/written/published by Apple!
|
|
Packit |
29108b |
*
|
|
Packit |
29108b |
* $Id$
|
|
Packit |
29108b |
*/
|
|
Packit |
29108b |
|
|
Packit |
29108b |
|
|
Packit |
29108b |
#ifndef DB_PARSER_H
|
|
Packit |
29108b |
#define DB_PARSER_H
|
|
Packit |
29108b |
|
|
Packit |
29108b |
#include <glib.h>
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
typedef struct _MHeader MHeader;
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhlHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 num_children;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
typedef struct _MhlHeader MhlHeader;
|
|
Packit |
29108b |
|
|
Packit |
29108b |
|
|
Packit |
29108b |
typedef struct _MhbdHeader MhbdHeader;
|
|
Packit |
29108b |
typedef struct _ArtworkDB_MhsdHeader ArtworkDB_MhsdHeader;
|
|
Packit |
29108b |
/*typedef struct _MhsdHeader MhsdHeader;*/
|
|
Packit |
29108b |
typedef struct _MhltHeader MhltHeader;
|
|
Packit |
29108b |
typedef struct _MhlpHeader MhlpHeader;
|
|
Packit |
29108b |
typedef struct _MhypHeader MhypHeader;
|
|
Packit |
29108b |
typedef struct _MhipHeader MhipHeader;
|
|
Packit |
29108b |
typedef struct _MhitHeader MhitHeader;
|
|
Packit |
29108b |
typedef struct _ArtworkDB_MhodHeader ArtworkDB_MhodHeader;
|
|
Packit |
29108b |
/*typedef struct _MhodHeader MhodHeader;*/
|
|
Packit |
29108b |
typedef struct _MhfdHeader MhfdHeader;
|
|
Packit |
29108b |
typedef struct _MhliHeader MhliHeader;
|
|
Packit |
29108b |
typedef struct _MhiiHeader MhiiHeader;
|
|
Packit |
29108b |
typedef struct _MhniHeader MhniHeader;
|
|
Packit |
29108b |
typedef struct _MhlaHeader MhlaHeader;
|
|
Packit |
29108b |
typedef struct _MhbaHeader MhbaHeader;
|
|
Packit |
29108b |
typedef struct _MhlfHeader MhlfHeader;
|
|
Packit |
29108b |
typedef struct _MhifHeader MhifHeader;
|
|
Packit |
29108b |
typedef struct _MhiaHeader MhiaHeader;
|
|
Packit |
29108b |
|
|
Packit |
29108b |
typedef struct _MhitHeader471 MhitHeader471;
|
|
Packit |
29108b |
/* MHOD typedef mess */
|
|
Packit |
29108b |
typedef struct _ArtworkDB_MhodHeaderString ArtworkDB_MhodHeaderString;
|
|
Packit |
29108b |
typedef struct _MhodHeaderString MhodHeaderString;
|
|
Packit |
29108b |
typedef struct _MhodHeaderSmartPlaylistData MhodHeaderSmartPlaylistData;
|
|
Packit |
29108b |
typedef struct _MhodHeaderSmartPlaylistRuleString MhodHeaderSmartPlaylistRuleString;
|
|
Packit |
29108b |
typedef struct _MhodHeaderSmartPlaylistRuleNonString MhodHeaderSmartPlaylistRuleNonString;
|
|
Packit |
29108b |
typedef struct _MhodHeaderSmartPlaylistRule MhodHeaderSmartPlaylistRule;
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhbdHeader {
|
|
Packit |
29108b |
gchar header_id[4];
|
|
Packit |
29108b |
guint32 header_len;
|
|
Packit |
29108b |
guint32 total_len;
|
|
Packit |
29108b |
guint32 unknown1;
|
|
Packit |
29108b |
guint32 version;
|
|
Packit |
29108b |
guint32 num_children;
|
|
Packit |
29108b |
guint64 db_id;
|
|
Packit |
29108b |
guint16 platform;
|
|
Packit |
29108b |
guint16 unk_0x22;
|
|
Packit |
29108b |
guint64 id_0x24;
|
|
Packit |
29108b |
guint32 unk_0x2c;
|
|
Packit |
29108b |
guint16 hashing_scheme;
|
|
Packit |
29108b |
guchar unk_0x32[20];
|
|
Packit |
29108b |
gchar language_id[2];
|
|
Packit |
29108b |
guint64 db_persistent_id;
|
|
Packit |
29108b |
guint32 unk_0x50;
|
|
Packit |
29108b |
guint32 unk_0x54;
|
|
Packit |
29108b |
guchar hash58[20];
|
|
Packit |
29108b |
gint32 timezone_offset;
|
|
Packit |
29108b |
guint16 unk_0x70;
|
|
Packit |
29108b |
guchar hash72[46];
|
|
Packit |
29108b |
guint16 audio_language;
|
|
Packit |
29108b |
guint16 subtitle_language;
|
|
Packit |
29108b |
guint16 unk_0xa4;
|
|
Packit |
29108b |
guint16 unk_0xa6;
|
|
Packit |
29108b |
guint16 unk_0xa8;
|
|
Packit |
29108b |
guchar align_0xa9;
|
|
Packit |
29108b |
guchar hashAB[57];
|
|
Packit |
29108b |
guchar padding[];
|
|
Packit |
29108b |
} __attribute__((__packed__));
|
|
Packit |
29108b |
|
|
Packit |
29108b |
enum MhsdIndexType {
|
|
Packit |
29108b |
MHSD_TRACK_LIST = 1,
|
|
Packit |
29108b |
MHSD_PLAYLIST_LIST = 2
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
enum MhsdPhotoIndexType {
|
|
Packit |
29108b |
MHSD_IMAGE_LIST = 1,
|
|
Packit |
29108b |
MHSD_ALBUM_LIST = 2,
|
|
Packit |
29108b |
MHSD_FILE_LIST = 3
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _ArtworkDB_MhsdHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
/* Strangely, the following field is only 16 bits long in the
|
|
Packit |
29108b |
* ArtworkDB (it's definitely 32 bits in the iTunesDB). This
|
|
Packit |
29108b |
* could well be an error with the first generation of mobile
|
|
Packit |
29108b |
* phones with iPod support).
|
|
Packit |
29108b |
*/
|
|
Packit |
29108b |
gint16 index;
|
|
Packit |
29108b |
gint16 unknown014;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _iTunesDB_MhsdHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint32 index;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
struct _MhltHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 num_songs;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhlpHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 num_playlists;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhypHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint32 num_mhod;
|
|
Packit |
29108b |
gint32 num_items;
|
|
Packit |
29108b |
gint32 hidden;
|
|
Packit |
29108b |
gint32 timestamp;
|
|
Packit |
29108b |
gint32 playlist_id;
|
|
Packit |
29108b |
gint32 unknown3;
|
|
Packit |
29108b |
gint32 unknown4;
|
|
Packit |
29108b |
gint32 unknown5;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhipHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint32 unknown1;
|
|
Packit |
29108b |
gint32 format_id;
|
|
Packit |
29108b |
gint32 unknown2;
|
|
Packit |
29108b |
gint32 track_id;
|
|
Packit |
29108b |
gint32 timestamp;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
/* MHIT header as written by iTunes 4.7.1, the added fields (from unknown17 to
|
|
Packit |
29108b |
* the end of the struct) are pretty useless, so we don't use this struct
|
|
Packit |
29108b |
*/
|
|
Packit |
29108b |
struct _MhitHeader471 {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint32 num_mhod;
|
|
Packit |
29108b |
gint32 track_id;
|
|
Packit |
29108b |
gint32 visible;
|
|
Packit |
29108b |
gint32 filetype;
|
|
Packit |
29108b |
/* FIXME: endianness issue with the order of the 3 fields above ? */
|
|
Packit |
29108b |
gint16 type;
|
|
Packit |
29108b |
gchar compilation;
|
|
Packit |
29108b |
gchar rating;
|
|
Packit |
29108b |
gint32 date_added;
|
|
Packit |
29108b |
gint32 size;
|
|
Packit |
29108b |
gint32 length;
|
|
Packit |
29108b |
gint32 track_number;
|
|
Packit |
29108b |
gint32 track_total;
|
|
Packit |
29108b |
gint32 year;
|
|
Packit |
29108b |
gint32 bitrate;
|
|
Packit |
29108b |
/* FIXME: endianness issue with the order of the 2 fields above ? */
|
|
Packit |
29108b |
gint16 unknown;
|
|
Packit |
29108b |
gint16 sample_rate;
|
|
Packit |
29108b |
gint32 volume;
|
|
Packit |
29108b |
gint32 start_time;
|
|
Packit |
29108b |
gint32 stop_time;
|
|
Packit |
29108b |
gint32 sound_check;
|
|
Packit |
29108b |
gint32 play_count;
|
|
Packit |
29108b |
gint32 play_count2;
|
|
Packit |
29108b |
gint32 last_played;
|
|
Packit |
29108b |
gint32 disc_number;
|
|
Packit |
29108b |
gint32 disc_total;
|
|
Packit |
29108b |
gint32 user_id;
|
|
Packit |
29108b |
gint32 last_modified;
|
|
Packit |
29108b |
gint32 bookmark_time;
|
|
Packit |
29108b |
gint64 song_id;
|
|
Packit |
29108b |
/* FIXME: endianness issue with the order of the 5 fields above ? */
|
|
Packit |
29108b |
gchar checked;
|
|
Packit |
29108b |
gchar app_rating;
|
|
Packit |
29108b |
gint16 bpm;
|
|
Packit |
29108b |
gint16 artwork_count;
|
|
Packit |
29108b |
gint16 unknown9;
|
|
Packit |
29108b |
gint32 artwork_size;
|
|
Packit |
29108b |
gint32 unknown11;
|
|
Packit |
29108b |
gint32 sample_rate2;
|
|
Packit |
29108b |
gint32 unknown13;
|
|
Packit |
29108b |
gint32 unknown14;
|
|
Packit |
29108b |
gint32 unknown15;
|
|
Packit |
29108b |
gint32 unknown16;
|
|
Packit |
29108b |
gint32 unknown17;
|
|
Packit |
29108b |
gint32 unknown18;
|
|
Packit |
29108b |
gint32 unknown19;
|
|
Packit |
29108b |
gint64 song_id2;
|
|
Packit |
29108b |
gint32 unknown20;
|
|
Packit |
29108b |
gint32 unknown21;
|
|
Packit |
29108b |
gint32 unknown22;
|
|
Packit |
29108b |
gint32 unknown23;
|
|
Packit |
29108b |
gint32 unknown24;
|
|
Packit |
29108b |
gint32 unknown25;
|
|
Packit |
29108b |
gint32 unknown26;
|
|
Packit |
29108b |
gint32 unknown27;
|
|
Packit |
29108b |
gint32 unknown28;
|
|
Packit |
29108b |
gint32 unknown29;
|
|
Packit |
29108b |
gint32 unknown30;
|
|
Packit |
29108b |
gint32 unknown31;
|
|
Packit |
29108b |
gint32 unknown32;
|
|
Packit |
29108b |
gint32 unknown33;
|
|
Packit |
29108b |
gint32 unknown34;
|
|
Packit |
29108b |
gint32 unknown35;
|
|
Packit |
29108b |
gint32 unknown36;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhitHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint32 num_mhod;
|
|
Packit |
29108b |
gint32 track_id;
|
|
Packit |
29108b |
gint32 visible;
|
|
Packit |
29108b |
gint32 filetype;
|
|
Packit |
29108b |
/* FIXME: endianness issue with the order of the 3 fields above ? */
|
|
Packit |
29108b |
gint16 type;
|
|
Packit |
29108b |
gchar compilation;
|
|
Packit |
29108b |
gchar rating;
|
|
Packit |
29108b |
gint32 date_added;
|
|
Packit |
29108b |
gint32 size;
|
|
Packit |
29108b |
gint32 length;
|
|
Packit |
29108b |
gint32 track_number;
|
|
Packit |
29108b |
gint32 track_total;
|
|
Packit |
29108b |
gint32 year;
|
|
Packit |
29108b |
gint32 bitrate;
|
|
Packit |
29108b |
/* FIXME: endianness issue with the order of the 2 fields above ? */
|
|
Packit |
29108b |
gint16 unknown;
|
|
Packit |
29108b |
gint16 sample_rate;
|
|
Packit |
29108b |
gint32 volume;
|
|
Packit |
29108b |
gint32 start_time;
|
|
Packit |
29108b |
gint32 stop_time;
|
|
Packit |
29108b |
gint32 sound_check;
|
|
Packit |
29108b |
gint32 play_count;
|
|
Packit |
29108b |
gint32 play_count2;
|
|
Packit |
29108b |
gint32 last_played;
|
|
Packit |
29108b |
gint32 disc_number;
|
|
Packit |
29108b |
gint32 disc_total;
|
|
Packit |
29108b |
gint32 user_id;
|
|
Packit |
29108b |
gint32 last_modified;
|
|
Packit |
29108b |
gint32 bookmark_time;
|
|
Packit |
29108b |
gint64 song_id;
|
|
Packit |
29108b |
/* FIXME: endianness issue with the order of the 5 fields above ? */
|
|
Packit |
29108b |
gchar checked;
|
|
Packit |
29108b |
gchar app_rating;
|
|
Packit |
29108b |
gint16 bpm;
|
|
Packit |
29108b |
gint16 artwork_count;
|
|
Packit |
29108b |
gint16 unknown9;
|
|
Packit |
29108b |
gint32 artwork_size;
|
|
Packit |
29108b |
gint32 unknown11;
|
|
Packit |
29108b |
gint32 sample_rate2;
|
|
Packit |
29108b |
gint32 unknown13;
|
|
Packit |
29108b |
gint32 unknown14;
|
|
Packit |
29108b |
gint32 unknown15;
|
|
Packit |
29108b |
gint32 unknown16;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
enum MhodEncoding {
|
|
Packit |
29108b |
MHOD_ENCODING_UTF16 = 0,
|
|
Packit |
29108b |
MHOD_ENCODING_UTF8 = 1
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
enum MhodType {
|
|
Packit |
29108b |
MHOD_TYPE_TITLE = 1,
|
|
Packit |
29108b |
MHOD_TYPE_LOCATION = 2,
|
|
Packit |
29108b |
MHOD_TYPE_ALBUM = 3,
|
|
Packit |
29108b |
MHOD_TYPE_ARTIST = 4,
|
|
Packit |
29108b |
MHOD_TYPE_GENRE = 5,
|
|
Packit |
29108b |
MHOD_TYPE_FILETYPE = 6,
|
|
Packit |
29108b |
MHOD_TYPE_EQ_SETTING = 7,
|
|
Packit |
29108b |
MHOD_TYPE_COMMENT = 8,
|
|
Packit |
29108b |
MHOD_TYPE_COMPOSER = 12,
|
|
Packit |
29108b |
MHOD_TYPE_GROUPING = 13,
|
|
Packit |
29108b |
MHOD_TYPE_SMART_PLAYLIST_DATA = 50,
|
|
Packit |
29108b |
MHOD_TYPE_SMART_PLAYLIST_RULES = 51,
|
|
Packit |
29108b |
MHOD_TYPE_LIBRARY_PLAYLIST_INDEX = 52,
|
|
Packit |
29108b |
MHOD_TYPE_100 = 100
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhodHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint32 type;
|
|
Packit |
29108b |
gint32 unknown1;
|
|
Packit |
29108b |
gint32 unknown2;
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _ArtworkDB_MhodHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
/* Strangely, the following field is only 16 bits long in the
|
|
Packit |
29108b |
* ArtworkDB (it's definitely 32 bits in the iTunesDB). This
|
|
Packit |
29108b |
* could well be an error with the first generation of mobile
|
|
Packit |
29108b |
* phones with iPod support).
|
|
Packit |
29108b |
*/
|
|
Packit |
29108b |
gint16 type;
|
|
Packit |
29108b |
gint16 unknown014;
|
|
Packit |
29108b |
gint32 unknown1;
|
|
Packit |
29108b |
gint32 unknown2;
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhodHeaderString {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint32 type; /* < 50 */
|
|
Packit |
29108b |
gint32 unknown1;
|
|
Packit |
29108b |
gint32 unknown2;
|
|
Packit |
29108b |
gint32 position;
|
|
Packit |
29108b |
gint32 string_len;
|
|
Packit |
29108b |
gint32 unknown3; /* It was thought that this was string encoding:
|
|
Packit |
29108b |
* 0 == UTF-16, 1 == UTF-8, however, recent iTunesDB
|
|
Packit |
29108b |
* files have had this set to 1 even with UTF-16 strings.
|
|
Packit |
29108b |
* Therefore this is definitely incorrect, and the
|
|
Packit |
29108b |
* correct meaning has not yet been discovered yet. */
|
|
Packit |
29108b |
gint32 unknown4;
|
|
Packit |
29108b |
unsigned char string[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
enum MhodArtworkType {
|
|
Packit |
29108b |
MHOD_ARTWORK_TYPE_ALBUM_NAME = 1, /* string: album name (in the Photo Database) */
|
|
Packit |
29108b |
MHOD_ARTWORK_TYPE_THUMBNAIL = 2, /* container: thumbnail image */
|
|
Packit |
29108b |
MHOD_ARTWORK_TYPE_FILE_NAME = 3, /* string: file name */
|
|
Packit |
29108b |
MHOD_ARTWORK_TYPE_IMAGE = 5 /* container: full resolution image (in the Photo Database) */
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _ArtworkDB_MhodHeaderString {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint16 type;
|
|
Packit |
29108b |
gint8 unknown13;
|
|
Packit |
29108b |
gint8 padding_len;
|
|
Packit |
29108b |
gint32 unknown1;
|
|
Packit |
29108b |
gint32 unknown2;
|
|
Packit |
29108b |
gint32 string_len;
|
|
Packit |
29108b |
gint8 encoding; /* 0,1: string is UTF8, 2: string is UTF16-LE */
|
|
Packit |
29108b |
gint8 unknown5;
|
|
Packit |
29108b |
gint16 unknown6;
|
|
Packit |
29108b |
gint32 unknown4;
|
|
Packit |
29108b |
gchar string[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
enum MhodLimitType {
|
|
Packit |
29108b |
MHOD_LIMIT_MINUTES = 1,
|
|
Packit |
29108b |
MHOD_LIMIT_MEGABYTES = 2,
|
|
Packit |
29108b |
MHOD_LIMIT_SONGS = 3,
|
|
Packit |
29108b |
MHOD_LIMIT_HOURS = 4,
|
|
Packit |
29108b |
MHOD_LIMIT_GIGABYTES = 5
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
enum MhodLimitSortType {
|
|
Packit |
29108b |
MHOD_LIMIT_SORT_RANDOM = 0x02,
|
|
Packit |
29108b |
MHOD_LIMIT_SORT_SONG_NAME = 0x03,
|
|
Packit |
29108b |
MHOD_LIMIT_SORT_ALBUM = 0x04,
|
|
Packit |
29108b |
MHOD_LIMIT_SORT_ARTIST = 0x05,
|
|
Packit |
29108b |
MHOD_LIMIT_SORT_GENRE = 0x07,
|
|
Packit |
29108b |
MHOD_LIMIT_SORT_MOST_RECENTLY_ADDED = 0x10,
|
|
Packit |
29108b |
MHOD_LIMIT_SORT_MOST_OFTEN_PLAYED = 0x14,
|
|
Packit |
29108b |
MHOD_LIMIT_SORT_MOST_RECENTLY_PLAYED = 0x15,
|
|
Packit |
29108b |
MHOD_LIMIT_SORT_HIGHEST_RATING = 0x17
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhodHeaderSmartPlaylistData {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint32 type; /* 50 */
|
|
Packit |
29108b |
gint32 unknown1;
|
|
Packit |
29108b |
gint32 unknown2;
|
|
Packit |
29108b |
gchar live_update;
|
|
Packit |
29108b |
gchar rules_enable;
|
|
Packit |
29108b |
gchar limit_enable;
|
|
Packit |
29108b |
gchar limit_type;
|
|
Packit |
29108b |
gchar limit_sort;
|
|
Packit |
29108b |
gchar unknow3[3];
|
|
Packit |
29108b |
gint32 limit;
|
|
Packit |
29108b |
gchar match_checked_only;
|
|
Packit |
29108b |
gchar reverse_limit_sort;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
|
|
Packit |
29108b |
enum MhodSmartPlaylistRuleFieldType {
|
|
Packit |
29108b |
MHOD_FIELD_SONG_NAME = 0x02,
|
|
Packit |
29108b |
MHOD_FIELD_ALBUM = 0x03,
|
|
Packit |
29108b |
MHOD_FIELD_ARTIST = 0x04,
|
|
Packit |
29108b |
MHOD_FIELD_BITRATE = 0x05,
|
|
Packit |
29108b |
MHOD_FIELD_SAMPLE_RATE = 0x06,
|
|
Packit |
29108b |
MHOD_FIELD_YEAR = 0x07,
|
|
Packit |
29108b |
MHOD_FIELD_GENRE = 0x08,
|
|
Packit |
29108b |
MHOD_FIELD_KIND = 0x09,
|
|
Packit |
29108b |
MHOD_FIELD_DATE_MODIFIED = 0x0a,
|
|
Packit |
29108b |
MHOD_FIELD_TRACK_NUMBER = 0x0b,
|
|
Packit |
29108b |
MHOD_FIELD_SIZE = 0x0c,
|
|
Packit |
29108b |
MHOD_FIELD_TIME = 0x0d,
|
|
Packit |
29108b |
MHOD_FIELD_COMMENT = 0x0e,
|
|
Packit |
29108b |
MHOD_FIELD_DATE_ADDED = 0x10,
|
|
Packit |
29108b |
MHOD_FIELD_COMPOSER = 0x12,
|
|
Packit |
29108b |
MHOD_FIELD_PLAY_COUNT = 0x16,
|
|
Packit |
29108b |
MHOD_FIELD_LAST_PLAYED = 0x17,
|
|
Packit |
29108b |
MHOD_FIELD_DISC_NUMBER = 0x18,
|
|
Packit |
29108b |
MHOD_FIELD_RATING = 0x19,
|
|
Packit |
29108b |
MHOD_FIELD_COMPILATION = 0x1f,
|
|
Packit |
29108b |
MHOD_FIELD_BPM = 0x23,
|
|
Packit |
29108b |
MHOD_FIELD_GROUPING = 0x27,
|
|
Packit |
29108b |
MHOD_FIELD_PLAYLIST = 0x28
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
enum MhodSmartPlaylistRuleAction {
|
|
Packit |
29108b |
MHOD_RULE_IS = 1 << 0,
|
|
Packit |
29108b |
MHOD_RULE_CONTAINS = 1 << 1,
|
|
Packit |
29108b |
MHOD_RULE_BEGINS_WITH = 1 << 2,
|
|
Packit |
29108b |
MHOD_RULE_ENDS_WITH = 1 << 3,
|
|
Packit |
29108b |
MHOD_RULE_GREATER_THAN = 1 << 4,
|
|
Packit |
29108b |
MHOD_RULE_GREATER_THAN_OR_EQUAL_TO = 1 << 5,
|
|
Packit |
29108b |
MHOD_RULE_LESS_THAN = 1 << 6,
|
|
Packit |
29108b |
MHOD_RULE_LESS_THAN_OR_EQUAL_TO = 1 << 7,
|
|
Packit |
29108b |
MHOD_RULE_IN_THE_RANGE = 1 << 8,
|
|
Packit |
29108b |
MHOD_RULE_IS_THE_LAST = 1 << 9,
|
|
Packit |
29108b |
MHOD_RULE_NOT = 1 << 24,
|
|
Packit |
29108b |
MHOD_RULE_STRING = 1 << 25
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhodHeaderSmartPlaylistRuleString {
|
|
Packit |
29108b |
/* Big endian fields */
|
|
Packit |
29108b |
gint32 field;
|
|
Packit |
29108b |
gint32 action;
|
|
Packit |
29108b |
gchar padding[44];
|
|
Packit |
29108b |
gint32 string_len;
|
|
Packit |
29108b |
gchar string[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhodHeaderSmartPlaylistRuleNonString {
|
|
Packit |
29108b |
/* Big endian fields */
|
|
Packit |
29108b |
gint32 field;
|
|
Packit |
29108b |
gint32 action;
|
|
Packit |
29108b |
gchar padding[44];
|
|
Packit |
29108b |
gint32 length;
|
|
Packit |
29108b |
guint64 from_value;
|
|
Packit |
29108b |
gint64 from_date;
|
|
Packit |
29108b |
guint64 from_unit;
|
|
Packit |
29108b |
guint64 to_value;
|
|
Packit |
29108b |
gint64 to_date;
|
|
Packit |
29108b |
guint64 to_unit;
|
|
Packit |
29108b |
gchar unknown[20];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhodHeaderSmartPlaylistRule {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint32 type; /* 51 */
|
|
Packit |
29108b |
gint32 unknown1;
|
|
Packit |
29108b |
gint32 unknown2;
|
|
Packit |
29108b |
gchar rules_id[4];
|
|
Packit |
29108b |
/* Fields stored in big-endian from there */
|
|
Packit |
29108b |
gint32 unknown5;
|
|
Packit |
29108b |
gint32 number_of_rules;
|
|
Packit |
29108b |
gint32 rules_operator;
|
|
Packit |
29108b |
gchar padding[120];
|
|
Packit |
29108b |
union {
|
|
Packit |
29108b |
MhodHeaderSmartPlaylistRuleString rule_string;
|
|
Packit |
29108b |
MhodHeaderSmartPlaylistRuleNonString rule_non_string;
|
|
Packit |
29108b |
} rule;
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhfdHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint32 unknown1;
|
|
Packit |
29108b |
gint32 unknown2; /* always seem to be 1 for older databases,
|
|
Packit |
29108b |
in an ArtworkDB generated by iTunes 4.9 or
|
|
Packit |
29108b |
above, it's 2. Caution: iTunes7 removes
|
|
Packit |
29108b |
the whole database if this field is 1 */
|
|
Packit |
29108b |
gint32 num_children;
|
|
Packit |
29108b |
gint32 unknown3;
|
|
Packit |
29108b |
gint32 next_id;
|
|
Packit |
29108b |
gint64 unknown5;
|
|
Packit |
29108b |
gint64 unknown6;
|
|
Packit |
29108b |
gint8 unknown_flag1;
|
|
Packit |
29108b |
gint8 unknown_flag2;
|
|
Packit |
29108b |
gint8 unknown_flag3;
|
|
Packit |
29108b |
gint8 unknown_flag4;
|
|
Packit |
29108b |
gint32 unknown8;
|
|
Packit |
29108b |
gint32 unknown9;
|
|
Packit |
29108b |
gint32 unknown10;
|
|
Packit |
29108b |
gint32 unknown11;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhliHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 num_children;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhiiHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint32 num_children;
|
|
Packit |
29108b |
gint32 image_id;
|
|
Packit |
29108b |
gint64 song_id;
|
|
Packit |
29108b |
gint32 unknown4;
|
|
Packit |
29108b |
gint32 rating;
|
|
Packit |
29108b |
gint32 unknown6;
|
|
Packit |
29108b |
gint32 orig_date;
|
|
Packit |
29108b |
gint32 digitized_date;
|
|
Packit |
29108b |
gint32 orig_img_size;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
} __attribute__((__packed__));
|
|
Packit |
29108b |
/* I we don't put the 'packed' attribute above, some 64 bit systems
|
|
Packit |
29108b |
* will pad the 64 bit integer to be aligned to an 8-byte boundary.
|
|
Packit |
29108b |
* Hopefully there won't be any systems around that crash when
|
|
Packit |
29108b |
* accessing 64 bit integers not aligned to 8-byte boundaries. */
|
|
Packit |
29108b |
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhniHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint32 num_children;
|
|
Packit |
29108b |
gint32 format_id;
|
|
Packit |
29108b |
gint32 ithmb_offset;
|
|
Packit |
29108b |
gint32 image_size;
|
|
Packit |
29108b |
gint16 vertical_padding;
|
|
Packit |
29108b |
gint16 horizontal_padding;
|
|
Packit |
29108b |
gint16 image_height;
|
|
Packit |
29108b |
gint16 image_width;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhlaHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 num_children;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhbaHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint32 num_mhods; /* number of Data Objects in the List,
|
|
Packit |
29108b |
probably always 1 */
|
|
Packit |
29108b |
gint32 num_mhias; /* number of pictures in the album */
|
|
Packit |
29108b |
gint32 album_id; /* starts out at $64 and increments by 1 */
|
|
Packit |
29108b |
gint32 unk024; /* unknown, seems to be always 0 */
|
|
Packit |
29108b |
gint16 unk028; /* unknown, seems to be always 0 */
|
|
Packit |
29108b |
guint8 album_type; /* 1 = master photo list ("Photo Library"),
|
|
Packit |
29108b |
2 = normal album, sometimes 4 and 5 */
|
|
Packit |
29108b |
guint8 playmusic; /* play music during slideshow (from iPhoto setting) */
|
|
Packit |
29108b |
guint8 repeat; /* repeat the slideshow (from iPhoto setting) */
|
|
Packit |
29108b |
guint8 random; /* show the slides in random order (from iPhoto
|
|
Packit |
29108b |
setting) */
|
|
Packit |
29108b |
guint8 show_titles;/* show slide captions (from iPhoto setting) */
|
|
Packit |
29108b |
guint8 transition_direction; /* 0=none, 1=left-to-right,
|
|
Packit |
29108b |
2=right-to-left, 3=top-to-bottom,
|
|
Packit |
29108b |
4=bottom-to-top (from iPhoto setting) */
|
|
Packit |
29108b |
gint32 slide_duration; /* in seconds (from iPhoto setting) */
|
|
Packit |
29108b |
gint32 transition_duration; /* in milliseconds (from iPhoto setting) */
|
|
Packit |
29108b |
gint32 unk044; /* unknown, seems to always be 0 */
|
|
Packit |
29108b |
gint32 unk048; /* unknown, seems to always be 0 */
|
|
Packit |
29108b |
gint64 song_id; /* dbid2 of track in iTunesDB to play during
|
|
Packit |
29108b |
slideshow (from iPhoto setting) */
|
|
Packit |
29108b |
gint32 prev_album_id; /* the id of the previous photoalbum */
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhlfHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 num_files;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhifHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len;
|
|
Packit |
29108b |
gint32 unknown1;
|
|
Packit |
29108b |
gint32 format_id;
|
|
Packit |
29108b |
gint32 image_size;
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
struct _MhiaHeader {
|
|
Packit |
29108b |
unsigned char header_id[4];
|
|
Packit |
29108b |
gint32 header_len;
|
|
Packit |
29108b |
gint32 total_len; /* probably the size of the header and all child records;
|
|
Packit |
29108b |
* as there aren't any child records this is equal to header length */
|
|
Packit |
29108b |
gint32 unknown1; /* seems to be zero */
|
|
Packit |
29108b |
guint32 image_id; /* the id of the mhii record this mhia refers to */
|
|
Packit |
29108b |
unsigned char padding[];
|
|
Packit |
29108b |
};
|
|
Packit |
29108b |
|
|
Packit |
29108b |
|
|
Packit |
29108b |
#endif /* PARSE_DB_H */
|