Created
January 5, 2022 01:03
-
-
Save JKamsker/d3333c78789b0e878ba4bea9e3d457ea to your computer and use it in GitHub Desktop.
My findings
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| public class AudibleTag | |
| { | |
| public string LONG_DESCRIPTION { get; set; } | |
| /// <summary> | |
| /// eg: Transport: Transport 1 | |
| /// </summary> | |
| public string SHORT_TITLE { get; set; } | |
| /// <summary> | |
| /// eg: B00W5I55F0 | |
| /// </summary> | |
| public string ASIN { get; set; } | |
| /// <summary> | |
| /// eg: ADBL | |
| /// </summary> | |
| public string TYPE { get; set; } | |
| /// <summary> | |
| /// 110050 | |
| /// </summary> | |
| public string VERSION { get; set; } | |
| /// <summary> | |
| /// A1TG7EBYOIJUO2 | |
| /// </summary> | |
| public string GUID { get; set; } | |
| /// <summary> | |
| /// CR!2NN7KCDZB559X6V792C6DP0ZP67N | |
| /// </summary> | |
| public string AACR { get; set; } | |
| //BK_ADKO_002144 | |
| public string ProductId { get; set; } | |
| public string Publisher { get; private set; } | |
| public string Narrator { get; set; } | |
| public string ReleaseDate { get; private set; } | |
| public string AUTHOR { get; set; } | |
| public string CATEGORY { get; set; } | |
| public string COPYRIGHT { get; set; } | |
| public string COVER_ART { get; set; } | |
| public string PARENT_PRODUCT_ID { get; set; } | |
| public string PARENT_TITLE { get; set; } | |
| public string PRODUCT_ID { get; set; } | |
| public string PROVIDER { get; set; } | |
| public string PUBLISH_DATE { get; set; } | |
| public string SHORT_DESCRIPTION { get; set; } | |
| public string SUBCATEGORY { get; set; } | |
| public string TITLE { get; set; } | |
| public string USER_ALIAS { get; set; } | |
| public string PARENT_SHORT_TITLE { get; set; } | |
| public string TRACK_NUMBER { get; set; } | |
| public string SynchronizedImage { get; set; } | |
| public string Png { get; set; } | |
| /// <summary> | |
| /// This one is a wild guess. | |
| /// In case of https://www.audible.de/pd/B01FMANLM6 (Dämonenblut / Nachtfeuer / Perlmond) | |
| /// Asin is B01FMANQU8 and Parent_Asin is B01FMANLM6 | |
| /// Asin is not available via their official website, but the child is listed as such on their api (https://api.audible.de/1.0/catalog/products/B01FMANLM6?response_groups=contributors,media,price,product_attrs,product_desc,product_extended_attrs,product_plans,rating,review_attrs,sample,sku,series,relationships,badges) | |
| /// </summary> | |
| public string Parent_ASIN { get; private set; } | |
| public static AudibleTag FromTrack(Track track) | |
| { | |
| return new AudibleTag | |
| { | |
| LONG_DESCRIPTION = ValueOrEmpty(track.AdditionalFields, "@lde", "©des"), // lde was not there in my case | |
| SHORT_TITLE = ValueOrEmpty(track.AdditionalFields, "@sti"), // Transport: Transport 1 | |
| ASIN = ValueOrEmpty(track.AdditionalFields, "CDEK"), // B00W5I55F0 | |
| Parent_ASIN = ValueOrEmpty(track.AdditionalFields, "PASN"), // Asin: B00W5I55F0 | |
| TYPE = ValueOrEmpty(track.AdditionalFields, "CDET"), // ADBL | |
| VERSION = ValueOrEmpty(track.AdditionalFields, "VERS"), // 110050 | |
| GUID = ValueOrEmpty(track.AdditionalFields, "GUID"), //"A1TG7EBYOIJUO2" | |
| AACR = ValueOrEmpty(track.AdditionalFields, "AACR"), //"CR!2NN7KCDZB559X6V792C6DP0ZP67N" | |
| ProductId = ValueOrEmpty(track.AdditionalFields, "prID"), // BK_ADKO_002144 | |
| Publisher = ValueOrEmpty(track.AdditionalFields, "©pub"), // Audible Studios | |
| Narrator = ValueOrEmpty(track.AdditionalFields, "@nar", "©nrt"), // Heiko Grauel | |
| ReleaseDate = ValueOrEmpty(track.AdditionalFields, "rldt"), // 28-MAY-2015 | |
| // Those came out empty in my tests .... | |
| AUTHOR = ValueOrEmpty(track.AdditionalFields, "@aut"), | |
| CATEGORY = ValueOrEmpty(track.AdditionalFields, "@cat"), | |
| COPYRIGHT = ValueOrEmpty(track.AdditionalFields, "@cop"), | |
| COVER_ART = ValueOrEmpty(track.AdditionalFields, "@car"), | |
| PARENT_PRODUCT_ID = ValueOrEmpty(track.AdditionalFields, "@ppi"), | |
| PARENT_TITLE = ValueOrEmpty(track.AdditionalFields, "@pti"), | |
| PRODUCT_ID = ValueOrEmpty(track.AdditionalFields, "@pid"), | |
| PROVIDER = ValueOrEmpty(track.AdditionalFields, "@pro"), | |
| PUBLISH_DATE = ValueOrEmpty(track.AdditionalFields, "@pda"), | |
| SHORT_DESCRIPTION = ValueOrEmpty(track.AdditionalFields, "@sde"), | |
| SUBCATEGORY = ValueOrEmpty(track.AdditionalFields, "@sub"), | |
| TITLE = ValueOrEmpty(track.AdditionalFields, "@tit"), | |
| USER_ALIAS = ValueOrEmpty(track.AdditionalFields, "@ual"), | |
| PARENT_SHORT_TITLE = ValueOrEmpty(track.AdditionalFields, "@pst"), | |
| TRACK_NUMBER = ValueOrEmpty(track.AdditionalFields, "@tnu"), | |
| SynchronizedImage = ValueOrEmpty(track.AdditionalFields, "asyi"), | |
| Png = ValueOrEmpty(track.AdditionalFields, "png"), | |
| }; | |
| } | |
| public static void ToTrack(AudibleTag tag, Track track) | |
| { | |
| WriteIfNotEmpty(track, tag.LONG_DESCRIPTION, "@des"); | |
| WriteIfNotEmpty(track, tag.SHORT_TITLE, "@sti"); | |
| WriteIfNotEmpty(track, tag.ASIN, "CDEK"); | |
| WriteIfNotEmpty(track, tag.Parent_ASIN, "PASN"); | |
| WriteIfNotEmpty(track, tag.TYPE, "CDET"); | |
| WriteIfNotEmpty(track, tag.VERSION, "VERS"); | |
| WriteIfNotEmpty(track, tag.GUID, "GUID"); | |
| WriteIfNotEmpty(track, tag.AACR, "AACR"); | |
| WriteIfNotEmpty(track, tag.ProductId, "prID"); | |
| WriteIfNotEmpty(track, tag.Publisher, "©pub"); | |
| WriteIfNotEmpty(track, tag.Narrator, "©nrt"); | |
| WriteIfNotEmpty(track, tag.ReleaseDate, "rldt"); | |
| WriteIfNotEmpty(track, tag.AUTHOR, "@aut"); | |
| WriteIfNotEmpty(track, tag.CATEGORY, "@cat"); | |
| WriteIfNotEmpty(track, tag.COPYRIGHT, "@cop"); | |
| WriteIfNotEmpty(track, tag.COVER_ART, "@car"); | |
| WriteIfNotEmpty(track, tag.PARENT_PRODUCT_ID, "@ppi"); | |
| WriteIfNotEmpty(track, tag.PARENT_TITLE, "@pti"); | |
| WriteIfNotEmpty(track, tag.PRODUCT_ID, "@pid"); | |
| WriteIfNotEmpty(track, tag.PROVIDER, "@pro"); | |
| WriteIfNotEmpty(track, tag.PUBLISH_DATE, "@pda"); | |
| WriteIfNotEmpty(track, tag.SHORT_DESCRIPTION, "@sde"); | |
| WriteIfNotEmpty(track, tag.SUBCATEGORY, "@sub"); | |
| WriteIfNotEmpty(track, tag.TITLE, "@tit"); | |
| WriteIfNotEmpty(track, tag.USER_ALIAS, "@ual"); | |
| WriteIfNotEmpty(track, tag.PARENT_SHORT_TITLE, "@pst"); | |
| WriteIfNotEmpty(track, tag.TRACK_NUMBER, "@tnu"); | |
| WriteIfNotEmpty(track, tag.SynchronizedImage, "asyi"); | |
| WriteIfNotEmpty(track, tag.Png, "png"); | |
| } | |
| private static void WriteIfNotEmpty(Track track, string value, string key) | |
| { | |
| if (!string.IsNullOrEmpty(value)) | |
| { | |
| track.AdditionalFields[key] = value; | |
| } | |
| } | |
| private static string ValueOrEmpty(IDictionary<string, string> dictionary, params string[] keys) | |
| { | |
| foreach (var key in keys ?? Array.Empty<string>()) | |
| { | |
| if (dictionary.TryGetValue(key, out var value)) | |
| { | |
| dictionary.Remove(key); | |
| return value; | |
| } | |
| } | |
| return string.Empty; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment