private void UpdatePlaylist(MyWebRequest req)
        {

            if (_lastUpdate + _maxAge < DateTime.Now)
            {
                
                DateTime date = req.Parameters.ContainsKey("date") ? ParseDateTime(req.Parameters["date"]) : DateTime.Today;
                _channels = new ArcList().Run(_device.Proxy.SessionState.session);
                _channels.channels.RemoveAll(c => _device.Filter.Check("ttv").Find("ch" + c.id).Check());
                if (req.Parameters.ContainsKey("channel_id"))
                {
                    int channel_id = int.Parse(req.Parameters["channel_id"]);
                    var ch = _channels.channels.FirstOrDefault(c => c.epg_id == channel_id);
                    if (ch != null)
                        _records = new ArcRecords(ch == null ? 0 : ch.epg_id, date).Run(_device.Proxy.SessionState.session);
                    else
                        throw new FileNotFoundException();
                }
                else
                {
                    _records = new ArcRecords(0, date).Run(_device.Proxy.SessionState.session);
                    var groups = _records.records.GroupBy(r => r.epg_id).ToArray();
                    foreach (var kp in groups)
                    {
                        var ch = _channels.channels.Where(c => c.epg_id == kp.Key);
                        if (!ch.Any())
                            _records.records.RemoveAll(r => r.epg_id == kp.Key);
                    }
                }
                    
                    
            }

            if (!_channels.IsSuccess && !_records.IsSuccess)
            {
                if (_channels.Error == ApiError.incorrect || _channels.Error == ApiError.noconnect ||
                    _records.Error == ApiError.incorrect || _records.Error == ApiError.noconnect)
                {
                    while (!_device.Proxy.Login() || _device.Proxy.SessionState.Error == ApiError.noconnect)
                    {
                    }
                    if (!_device.Proxy.SessionState.IsSuccess)
                    {
                        throw new Exception("Ошибка подключения");
                    }
                    UpdatePlaylist(req);
                }
                else
                    switch (_records.Error)
                    {
                        case ApiError.norecord:
                            throw new Exception("Нет записей");
                        case ApiError.noconnect:
                            throw new Exception("ошибка соединения с БД");
                        case ApiError.noparam:
                            throw new Exception("ошибка входных параметров");
                    }
            }
        }
        private void UpdatePlaylist(MyWebRequest req)
        {
            if (_lastUpdate + _maxAge < DateTime.Now)
            {
                DateTime date = req.Parameters.ContainsKey("date") ? ParseDateTime(req.Parameters["date"]) : DateTime.Today;
                _channels = new ArcList().Run(_device.Proxy.SessionState.session);
                _channels.channels.RemoveAll(c => _device.Filter.Check("ttv").Find("ch" + c.id).Check());
                if (req.Parameters.ContainsKey("channel_id"))
                {
                    int channel_id = int.Parse(req.Parameters["channel_id"]);
                    var ch         = _channels.channels.FirstOrDefault(c => c.epg_id == channel_id);
                    if (ch != null)
                    {
                        _records = new ArcRecords(ch == null ? 0 : ch.epg_id, date).Run(_device.Proxy.SessionState.session);
                    }
                    else
                    {
                        throw new FileNotFoundException();
                    }
                }
                else
                {
                    _records = new ArcRecords(0, date).Run(_device.Proxy.SessionState.session);
                    var groups = _records.records.GroupBy(r => r.epg_id).ToArray();
                    foreach (var kp in groups)
                    {
                        var ch = _channels.channels.Where(c => c.epg_id == kp.Key);
                        if (!ch.Any())
                        {
                            _records.records.RemoveAll(r => r.epg_id == kp.Key);
                        }
                    }
                }
            }

            if (!_channels.IsSuccess && !_records.IsSuccess)
            {
                if (_channels.Error == ApiError.incorrect || _channels.Error == ApiError.noconnect ||
                    _records.Error == ApiError.incorrect || _records.Error == ApiError.noconnect)
                {
                    while (!_device.Proxy.Login() || _device.Proxy.SessionState.Error == ApiError.noconnect)
                    {
                    }
                    if (!_device.Proxy.SessionState.IsSuccess)
                    {
                        throw new Exception("Ошибка подключения");
                    }
                    UpdatePlaylist(req);
                }
                else
                {
                    switch (_records.Error)
                    {
                    case ApiError.norecord:
                        throw new Exception("Нет записей");

                    case ApiError.noconnect:
                        throw new Exception("ошибка соединения с БД");

                    case ApiError.noparam:
                        throw new Exception("ошибка входных параметров");
                    }
                }
            }
        }
 public override string GetPlaylist(MyWebRequest req)
 {
     try
     {
         UpdatePlaylist(req);
     }
     catch (Exception e)
     {
         return e.Message;
     }
     if (req.Parameters.ContainsKey("type"))
     {
         Playlist pl = Playlist.CreatePlaylist(req.Parameters["type"], req.Headers["host"], Playlist.ContentType.Archive);
         List<Record> arcs = new List<Record>();
         arcs.AddRange(_records.records);
         if (req.Parameters.ContainsKey("sort"))
         {
             switch (req.Parameters["sort"])
             {
                 case "channel":
                     arcs = arcs.OrderBy(arc => arc.epg_id).ToList();
                     break;
                 case "-channel":
                     arcs = arcs.OrderByDescending(arc => arc.epg_id).ToList();
                     break;
                 case "title":
                     arcs = arcs.OrderBy(arc => arc.name).ToList();
                     break;
                 case "-title":
                     arcs = arcs.OrderByDescending(arc => arc.name).ToList();
                     break;
                 case "id":
                     arcs = arcs.OrderBy(arc => arc.record_id).ToList();
                     break;
                 case "-id":
                     arcs = arcs.OrderByDescending(arc => arc.record_id).ToList();
                     break;
                 case "datetime":
                     arcs = arcs.OrderBy(arc => arc.Time).ToList();
                     break;
                 case "-datetime":
                     arcs = arcs.OrderByDescending(arc => arc.Time).ToList();
                     break;
             }
         }
         _records.CastChannels(_channels.channels);
         foreach (var ch in arcs)
         {
             if (ch.Channel != null)
                 pl.AddLine(ch, append: req.Parameters.ContainsKey("transcode") ? "&transcode=" + req.Parameters["transcode"] : "");
         }
         return pl.ToString();
     }
     DateTime date = req.Parameters.ContainsKey("date") ? ParseDateTime(req.Parameters["date"]) : DateTime.Today;
     var res = new ArcRecords(req.Parameters.ContainsKey("channel_id") ? int.Parse(req.Parameters["channel_id"]) : 0, date).Execute(_device.Proxy.SessionState.session, TypeResult.Xml);
     XDocument xd = XDocument.Load(res);
     var xchs = xd.Root.Element("records").Elements().GroupBy(e => int.Parse(e.Attribute("epg_id").Value)).ToArray();
     foreach (var xch in xchs)
     {
         if (!_channels.channels.Any(c => c.epg_id == xch.Key))
             xch.Remove();
     }
     return xd.ToString();
 }
        public override string GetPlaylist(MyWebRequest req)
        {
            try
            {
                UpdatePlaylist(req);
            }
            catch (Exception e)
            {
                return(e.Message);
            }
            if (req.Parameters.ContainsKey("type"))
            {
                Playlist      pl   = Playlist.CreatePlaylist(req.Parameters["type"], req.Headers["host"], Playlist.ContentType.Archive);
                List <Record> arcs = new List <Record>();
                arcs.AddRange(_records.records);
                if (req.Parameters.ContainsKey("sort"))
                {
                    switch (req.Parameters["sort"])
                    {
                    case "channel":
                        arcs = arcs.OrderBy(arc => arc.epg_id).ToList();
                        break;

                    case "-channel":
                        arcs = arcs.OrderByDescending(arc => arc.epg_id).ToList();
                        break;

                    case "title":
                        arcs = arcs.OrderBy(arc => arc.name).ToList();
                        break;

                    case "-title":
                        arcs = arcs.OrderByDescending(arc => arc.name).ToList();
                        break;

                    case "id":
                        arcs = arcs.OrderBy(arc => arc.record_id).ToList();
                        break;

                    case "-id":
                        arcs = arcs.OrderByDescending(arc => arc.record_id).ToList();
                        break;

                    case "datetime":
                        arcs = arcs.OrderBy(arc => arc.Time).ToList();
                        break;

                    case "-datetime":
                        arcs = arcs.OrderByDescending(arc => arc.Time).ToList();
                        break;
                    }
                }
                _records.CastChannels(_channels.channels);
                foreach (var ch in arcs)
                {
                    if (ch.Channel != null)
                    {
                        pl.AddLine(ch, append: req.Parameters.ContainsKey("transcode") ? "&transcode=" + req.Parameters["transcode"] : "");
                    }
                }
                return(pl.ToString());
            }
            DateTime  date = req.Parameters.ContainsKey("date") ? ParseDateTime(req.Parameters["date"]) : DateTime.Today;
            var       res  = new ArcRecords(req.Parameters.ContainsKey("channel_id") ? int.Parse(req.Parameters["channel_id"]) : 0, date).Execute(_device.Proxy.SessionState.session, TypeResult.Xml);
            XDocument xd   = XDocument.Load(res);
            var       xchs = xd.Root.Element("records").Elements().GroupBy(e => int.Parse(e.Attribute("epg_id").Value)).ToArray();

            foreach (var xch in xchs)
            {
                if (!_channels.channels.Any(c => c.epg_id == xch.Key))
                {
                    xch.Remove();
                }
            }
            return(xd.ToString());
        }