/// <summary>
        /// Unmarks one or more episodes.
        /// </summary>
        /// <param name="showid">The ID of the TV show in the database.</param>
        /// <param name="episodes">The list of episode ranges. A range consists of two numbers from the same season.</param>
        public override void UnmarkEpisodes(string showid, IEnumerable <int[]> episodes)
        {
            var change = InitChange(showid, ShowInfoChange.ChangeType.UnmarkEpisode, episodes);

            if (DelayedChanges.Any(x => x.Change == ShowInfoChange.ChangeType.UnmarkEpisode && x.Show == change.Show))
            {
                var prevmark = DelayedChanges.First(x => x.Change == ShowInfoChange.ChangeType.UnmarkEpisode && x.Show == change.Show);

                if (prevmark.Data is List <int[]> && change.Data is List <int[]> )
                {
                    (prevmark.Data as List <int[]>).AddRange(change.Data as List <int[]>);
                }
                else
                {
                    DelayedChanges.Add(change);
                }
            }
            else
            {
                DelayedChanges.Add(change);
            }

            DelayedChangesTimer.Start();
            SaveDelayedChanges();
        }
        /// <summary>
        /// Handles the Elapsed event of the DelayedChangesTimer control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.Timers.ElapsedEventArgs"/> instance containing the event data.</param>
        public void DelayedChangesTimerElapsed(object sender, ElapsedEventArgs e)
        {
            if (DelayedChanges.Count == 0)
            {
                return;
            }

            var changes = DelayedChanges.ToList();

            DelayedChanges.Clear();

            if (File.Exists(_delayedDataPath))
            {
                try { File.Delete(_delayedDataPath); }
                catch { }
            }

            var req = Remote.API.SendDatabaseChanges(changes, _user, _pass);

            if (!req.Success || !req.OK)
            {
                PendingChanges.AddRange(changes);
                PendingChangesTimer.Start();
                SavePendingChanges();
            }
        }
        /// <summary>
        /// Sends the reordered TV show list.
        /// </summary>
        public override void ReorderList()
        {
            var change = InitChange(null, ShowInfoChange.ChangeType.AddShow, Database.Query("select name from tvshows order by rowid asc").Select(dict => dict["name"]).ToArray());

            DelayedChanges.RemoveAll(x => x.Change == ShowInfoChange.ChangeType.ReorderList);
            DelayedChanges.Add(change);

            DelayedChangesTimer.Start();
            SaveDelayedChanges();
        }