Skip to content

Instantly share code, notes, and snippets.

@JKamsker
Created January 5, 2022 01:03
Show Gist options
  • Select an option

  • Save JKamsker/d3333c78789b0e878ba4bea9e3d457ea to your computer and use it in GitHub Desktop.

Select an option

Save JKamsker/d3333c78789b0e878ba4bea9e3d457ea to your computer and use it in GitHub Desktop.
My findings
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