public bool ChangeSongMetadata(IEnumerable<string> track_ids, IEnumerable<Dictionary<MetaKey, object>> changes) { if (track_ids == null) throw new ArgumentNullException("Argument 'track_ids' in ChangeSongMetadata must not be NULL!"); if (changes == null) throw new ArgumentNullException("Argument 'changes' in ChangeSongMetadata must not be NULL!"); if (track_ids.Count() != changes.Count()) throw new ArgumentException("Inconsistent data count of arguments 'track_ids' and 'changes'!"); bool success = false; ArrayList tracks = new ArrayList(); using (var changesEnumerator = changes.GetEnumerator()) { foreach (string track_id in track_ids) { if (!changesEnumerator.MoveNext()) break; Dictionary<MetaKey, object> metadata = changesEnumerator.Current; ArrayList track = new ArrayList(); foreach (string property in trackProperties) { if (property == "id") track.Add(track_id); else { try { MetaKey key = (MetaKey)Enum.Parse(typeof(MetaKey), property); if (metadata.Keys.Contains(key) && Type.GetTypeCode(metadata[key].GetType()) == (TypeCode)(Convert.ToInt32(key) % 0x100)) { track.Add(metadata[key]); } else track.Add(null); } catch (ArgumentException) { track.Add(null); } } } track.Add(new ArrayList()); tracks.Add(track); } } ArrayList array = new ArrayList { new ArrayList { _sessionId, 1 } }; array.Add(new ArrayList { tracks }); string data = array.ToJsArray(); string response = GoogleMusicService(Service.modifytracks, data); if (response != null) success = true; return success; }