message TopTracks {
    optional string country = 0x1;
    repeated Track track = 0x2;
}

message ActivityPeriod {
    optional sint32 start_year = 0x1;
    optional sint32 end_year = 0x2;
    optional sint32 decade = 0x3;
}

message Artist {
    optional bytes gid = 0x1;
    optional string name = 0x2;
    optional sint32 popularity = 0x3;
    repeated TopTracks top_track = 0x4;
    repeated AlbumGroup album_group = 0x5;
    repeated AlbumGroup single_group = 0x6;
    repeated AlbumGroup compilation_group = 0x7;
    repeated AlbumGroup appears_on_group = 0x8;
    repeated string genre = 0x9;
    repeated ExternalId external_id = 0xa;
    repeated Image portrait = 0xb;
    repeated Biography biography = 0xc;
    repeated ActivityPeriod activity_period = 0xd;
    repeated Restriction restriction = 0xe;
    repeated Artist related = 0xf;
    optional bool is_portrait_album_cover = 0x10;
    optional ImageGroup portrait_group = 0x11;
}

message AlbumGroup {
    repeated Album album = 0x1;
}

message Date {
    optional sint32 year = 0x1;
    optional sint32 month = 0x2;
    optional sint32 day = 0x3;
}

message Album {
    optional bytes gid = 0x1;
    optional string name = 0x2;
    repeated Artist artist = 0x3;
    optional Type typ = 0x4;
    enum Type {
        ALBUM = 0x1;
        SINGLE = 0x2;
        COMPILATION = 0x3;
    }
    optional string label = 0x5;
    optional Date date = 0x6;
    optional sint32 popularity = 0x7;
    repeated string genre = 0x8;
    repeated Image cover = 0x9;
    repeated ExternalId external_id = 0xa;
    repeated Disc disc = 0xb;
    repeated string review = 0xc;
    repeated Copyright copyright = 0xd;
    repeated Restriction restriction = 0xe;
    repeated Album related = 0xf;
    repeated SalePeriod sale_period = 0x10;
    optional ImageGroup cover_group = 0x11;
}

message Track {
    optional bytes gid = 0x1;
    optional string name = 0x2;
    optional Album album = 0x3;
    repeated Artist artist = 0x4;
    optional sint32 number = 0x5;
    optional sint32 disc_number = 0x6;
    optional sint32 duration = 0x7;
    optional sint32 popularity = 0x8;
    optional bool explicit = 0x9;
    repeated ExternalId external_id = 0xa;
    repeated Restriction restriction = 0xb;
    repeated AudioFile file = 0xc;
    repeated Track alternative = 0xd;
    repeated SalePeriod sale_period = 0xe;
    repeated AudioFile preview = 0xf;
}

message Image {
    optional bytes file_id = 0x1;
    optional Size size = 0x2;
    enum Size {
        DEFAULT = 0x0;
        SMALL = 0x1;
        LARGE = 0x2;
        XLARGE = 0x3;
    }
    optional sint32 width = 0x3;
    optional sint32 height = 0x4;
}

message ImageGroup {
    repeated Image image = 0x1;
}

message Biography {
    optional string text = 0x1;
    repeated Image portrait = 0x2;
    repeated ImageGroup portrait_group = 0x3;
}

message Disc {
    optional sint32 number = 0x1;
    optional string name = 0x2;
    repeated Track track = 0x3;
}

message Copyright {
    optional Type typ = 0x1;
    enum Type {
        P = 0x0;
        C = 0x1;
    }
    optional string text = 0x2;
}

message Restriction {
    optional string countries_allowed = 0x2;
    optional string countries_forbidden = 0x3;
    optional Type typ = 0x4;
    enum Type {
        STREAMING = 0x0;
    }
    repeated string catalogue_str = 0x5;
}

message SalePeriod {
    repeated Restriction restriction = 0x1;
    optional Date start = 0x2;
    optional Date end = 0x3;
}

message ExternalId {
    optional string typ = 0x1;
    optional string id = 0x2;
}

message AudioFile {
    optional bytes file_id = 0x1;
    optional Format format = 0x2;
    enum Format {
        OGG_VORBIS_96 = 0x0;
        OGG_VORBIS_160 = 0x1;
        OGG_VORBIS_320 = 0x2;
        MP3_256 = 0x3;
        MP3_320 = 0x4;
        MP3_160 = 0x5;
        MP3_96 = 0x6;
        OTHER = 0x7;
        OTHER2 = 0x8;
    }
}