// Scans the file for ogg rating/playcount tags as defined by the Quod Libet standard // All applicable tags are overwritten with the new values, regardless of tag author public static void StoreRating(int rating, TagLib.Ogg.XiphComment xiphtag) { ArrayList ratingFieldnames = new ArrayList(); // Collect list of rating tags to be updated: foreach (string fieldname in xiphtag) { if (fieldname.StartsWith(RatingPrefix, StringComparison.OrdinalIgnoreCase) || String.Compare(fieldname, MediaMonkeyRatingField, StringComparison.OrdinalIgnoreCase) == 0) { ratingFieldnames.Add(fieldname); } } // Add "HOWLER" tags if no rating tags were found and track is not "unrated": if (ratingFieldnames.Count == 0 && rating >= 0) { ratingFieldnames.Add(RatingPrefix + HowlerName); } if (rating < 0) { foreach (string ratingname in ratingFieldnames) xiphtag.RemoveField(ratingname); } else { int bansheeRating = (int) Math.Ceiling(rating / 20.0); string bansheeRatingString = BansheeToOgg(bansheeRating); foreach (string ratingname in ratingFieldnames) { if (String.Compare(ratingname, String.Concat(RatingPrefix, HowlerName), StringComparison.OrdinalIgnoreCase) == 0 || String.Compare(ratingname, MediaMonkeyRatingField, StringComparison.OrdinalIgnoreCase) == 0) { xiphtag.SetField(ratingname, rating.ToString(CultureInfo.InvariantCulture)); } else if (ratingname.StartsWith(RatingPrefix, StringComparison.OrdinalIgnoreCase)) { xiphtag.SetField(ratingname, bansheeRatingString); } } } }