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;
        }