Пример #1
0
        private void btnAddLineup_Click(object sender, EventArgs e)
        {
            var lineup = new CustomLineup
            {
                Lineup   = "OTA-CUSTOM-TUCSON",
                Location = "Tucson",
                Name     = "Local Over the Air Broadcast",
                Station  = new List <CustomStation>()
            };

            cbCustom.Items.Add(lineup);
            UpdateCustomListView();
        }
Пример #2
0
        private static bool buildLineupServices()
        {
            // query what lineups client is subscribed to
            SdLineupResponse clientLineups = sdAPI.sdGetLineups();

            if (clientLineups == null)
            {
                return(false);
            }

            // determine if there are custom lineups to consider
            if (File.Exists(Helper.Epg123CustomLineupsXmlPath))
            {
                CustomLineups customLineups = new CustomLineups();
                using (StreamReader stream = new StreamReader(Helper.Epg123CustomLineupsXmlPath, Encoding.Default))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(CustomLineups));
                    TextReader    reader     = new StringReader(stream.ReadToEnd());
                    customLineups = (CustomLineups)serializer.Deserialize(reader);
                    reader.Close();
                }

                foreach (CustomLineup lineup in customLineups.CustomLineup)
                {
                    if (!config.IncludedLineup.Contains(lineup.Lineup))
                    {
                        continue;
                    }
                    customLineup = lineup;

                    clientLineups.Lineups.Add(new SdLineup()
                    {
                        Lineup    = lineup.Lineup,
                        Name      = lineup.Name,
                        Transport = string.Empty,
                        Location  = lineup.Location,
                        Uri       = "CUSTOM",
                        IsDeleted = false
                    });

                    customMap          = new SdStationMapResponse();
                    customMap.Map      = new List <SdLineupMap>();
                    customMap.Stations = new List <SdLineupStation>();
                    customMap.Metadata = new sdMetadata()
                    {
                        Lineup = lineup.Lineup
                    };
                }
            }

            // reset counters
            processedObjects = 0; totalObjects = clientLineups.Lineups.Count;
            reportProgress();

            // process lineups
            Logger.WriteMessage(string.Format("Entering buildLineupServices() for {0} lineups.", clientLineups.Lineups.Count));
            foreach (SdLineup clientLineup in clientLineups.Lineups)
            {
                bool flagCustom = (!string.IsNullOrEmpty(clientLineup.Uri) && clientLineup.Uri.Equals("CUSTOM"));
                ++processedObjects; reportProgress();

                // request the lineup's station maps
                SdStationMapResponse lineupMap = null;
                if (!flagCustom)
                {
                    lineupMap = sdAPI.sdGetStationMaps(clientLineup.Lineup);
                    if (lineupMap == null)
                    {
                        continue;
                    }

                    foreach (SdLineupStation station in lineupMap.Stations)
                    {
                        if (!allStations.ContainsKey(station.StationID))
                        {
                            allStations.Add(station.StationID, station);
                        }
                    }
                }

                if (!config.IncludedLineup.Contains(clientLineup.Lineup))
                {
                    Logger.WriteVerbose(string.Format("Subscribed lineup {0} has been EXCLUDED from download and processing.", clientLineup.Lineup));
                    continue;
                }
                else if (clientLineup.IsDeleted)
                {
                    Logger.WriteWarning(string.Format("Subscribed lineup {0} has been DELETED at the headend.", clientLineup.Lineup));
                    continue;
                }
                else if (flagCustom)
                {
                    foreach (CustomStation station in customLineup.Station)
                    {
                        SdLineupStation lineupStation;
                        if (allStations.TryGetValue(station.StationId, out lineupStation))
                        {
                            customMap.Map.Add(new SdLineupMap()
                            {
                                StationID = station.StationId,
                                AtscMajor = int.Parse(station.Number),
                                AtscMinor = int.Parse(station.Subnumber)
                            });
                            customStations.Add(station.StationId);
                            customMap.Stations.Add(lineupStation);
                        }
                        else if (!string.IsNullOrEmpty(station.Alternate) && allStations.TryGetValue(station.Alternate, out lineupStation))
                        {
                            customMap.Map.Add(new SdLineupMap()
                            {
                                StationID = station.Alternate,
                                AtscMajor = int.Parse(station.Number),
                                AtscMinor = int.Parse(station.Subnumber)
                            });
                            customStations.Add(station.Alternate);
                            customMap.Stations.Add(lineupStation);
                        }
                    }
                    lineupMap = customMap;
                    Logger.WriteVerbose(string.Format("Successfully retrieved the station mapping for lineup {0}.", clientLineup.Lineup));
                }
                if (lineupMap == null)
                {
                    return(false);
                }

                int lineupIndex = sdMxf.With[0].Lineups.Count;
                sdMxf.With[0].Lineups.Add(new MxfLineup()
                {
                    index    = lineupIndex + 1,
                    Uid      = clientLineup.Lineup,
                    Name     = "EPG123 " + clientLineup.Name + " (" + clientLineup.Location + ")",
                    channels = new List <MxfChannel>()
                });

                // build the services and lineup
                foreach (SdLineupStation station in lineupMap.Stations)
                {
                    // check if station should be downloaded and processed
                    if (!flagCustom)
                    {
                        if ((station == null) || (excludedStations.Contains(station.StationID) && !customStations.Contains(station.StationID)))
                        {
                            continue;
                        }
                        if (!includedStations.Contains(station.StationID) && !config.AutoAddNew)
                        {
                            Logger.WriteWarning(string.Format("**** Lineup {0} ({1}) has added station {2} ({3}). ****", clientLineup.Name, clientLineup.Location, station.StationID, station.Callsign));
                            continue;
                        }
                    }

                    // build the service if necessary
                    MxfService mxfService = sdMxf.With[0].getService(station.StationID);
                    if (string.IsNullOrEmpty(mxfService.CallSign))
                    {
                        // add callsign and station name
                        mxfService.CallSign = station.Callsign;
                        mxfService.Name     = station.Name;

                        // add affiliate if available
                        if (!string.IsNullOrEmpty(station.Affiliate))
                        {
                            mxfService.Affiliate = sdMxf.With[0].getAffiliateId(station.Affiliate);
                        }

                        // set the ScheduleEntries service id
                        mxfService.mxfScheduleEntries.Service = mxfService.Id;

                        // add station logo if available and allowed
                        string logoPath = string.Format("{0}\\{1}.png", Helper.Epg123LogosFolder, station.Callsign);
                        if (config.IncludeSDLogos)
                        {
                            // make sure logos directory exists
                            if (!Directory.Exists(Helper.Epg123LogosFolder))
                            {
                                Directory.CreateDirectory(Helper.Epg123LogosFolder);
                            }

                            // add the existing logo or download the new logo if available
                            if (File.Exists(logoPath))
                            {
                                mxfService.LogoImage = sdMxf.With[0].getGuideImage("file://" + logoPath, getStringEncodedImage(logoPath)).Id;
                            }
                            else
                            {
                                string url = string.Empty;
                                if ((station.StationLogos != null) && (station.StationLogos.Count > 0))
                                {
                                    // the second station logo is typically the best contrast
                                    url = station.StationLogos[Math.Min(station.StationLogos.Count - 1, 1)].URL;
                                }
                                else if (station.Logo != null)
                                {
                                    url = station.Logo.URL;
                                }

                                // download, crop & resize logo image, save and add
                                if (!string.IsNullOrEmpty(url))
                                {
                                    stationLogosToDownload.Add(new KeyValuePair <MxfService, string>(mxfService, url));
                                }
                            }
                        }

                        // handle xmltv logos
                        SdStationImage logoImage = (station.StationLogos != null) ? station.StationLogos[station.StationLogos.Count - 1] : station.Logo;
                        if (config.XmltvIncludeChannelLogos.ToLower().Equals("url") && (logoImage != null))
                        {
                            mxfService.logoImage = logoImage;
                        }
                        else if (config.XmltvIncludeChannelLogos.ToLower().Equals("local") && File.Exists(logoPath))
                        {
                            Image image = Image.FromFile(logoPath);
                            mxfService.logoImage = new SdStationImage()
                            {
                                URL    = logoPath,
                                Height = image.Height,
                                Width  = image.Width
                            };
                        }
                        else if (config.XmltvIncludeChannelLogos.ToLower().Equals("substitute") && File.Exists(logoPath))
                        {
                            Image image = Image.FromFile(logoPath);
                            mxfService.logoImage = new SdStationImage()
                            {
                                URL    = string.Format("{0}\\{1}.png", config.XmltvLogoSubstitutePath.TrimEnd('\\'), station.Callsign),
                                Height = image.Height,
                                Width  = image.Width
                            };
                        }
                    }

                    // use hashset to make sure we don't duplicate channel entries for this station
                    HashSet <string> channelNumbers = new HashSet <string>();

                    // match station with mapping for lineup number and subnumbers
                    foreach (SdLineupMap map in lineupMap.Map)
                    {
                        int number    = -1;
                        int subnumber = 0;
                        if (map.StationID.Equals(station.StationID))
                        {
                            // QAM
                            if (map.ChannelMajor > 0)
                            {
                                number    = map.ChannelMajor;
                                subnumber = map.ChannelMinor;
                            }

                            // ATSC or NTSC
                            else if (map.AtscMajor > 0)
                            {
                                number    = map.AtscMajor;
                                subnumber = map.AtscMinor;
                            }
                            else if (map.UhfVhf > 0)
                            {
                                number = map.UhfVhf;
                            }

                            // Cable or Satellite
                            else if (!string.IsNullOrEmpty(map.Channel))
                            {
                                subnumber = 0;
                                if (Regex.Match(map.Channel, @"[A-Za-z]{1}[\d]{4}").Length > 0)
                                {
                                    // 4dtv has channels starting with 2 character satellite identifier
                                    number = int.Parse(map.Channel.Substring(2));
                                }
                                else if (!int.TryParse(Regex.Replace(map.Channel, "[^0-9.]", ""), out number))
                                {
                                    // if channel number is not a whole number, must be a decimal number
                                    string[] numbers = Regex.Replace(map.Channel, "[^0-9.]", "").Replace('_', '.').Replace('-', '.').Split('.');
                                    if (numbers.Length == 2)
                                    {
                                        number    = int.Parse(numbers[0]);
                                        subnumber = int.Parse(numbers[1]);
                                    }
                                }
                            }

                            string channelNumber = number.ToString() + ((subnumber > 0) ? "." + subnumber.ToString() : null);
                            if (channelNumbers.Add(channelNumber + ":" + station.StationID))
                            {
                                addLineupChannel(lineupMap.Metadata.Lineup, mxfService.StationID, mxfService.Id, number, subnumber, lineupIndex);
                            }
                        }
                    }
                }
            }

            if (stationLogosToDownload.Count > 0)
            {
                stationLogosDownloadComplete = false;
                Logger.WriteInformation(string.Format("Kicking off background worker to download and process {0} station logos.", stationLogosToDownload.Count));
                backgroundDownloader                            = new System.ComponentModel.BackgroundWorker();
                backgroundDownloader.DoWork                    += BackgroundDownloader_DoWork;
                backgroundDownloader.RunWorkerCompleted        += BackgroundDownloader_RunWorkerCompleted;
                backgroundDownloader.WorkerSupportsCancellation = true;
                backgroundDownloader.RunWorkerAsync();
            }

            if (sdMxf.With[0].Services.Count > 0)
            {
                Logger.WriteMessage("Exiting buildLineupServices(). SUCCESS.");
                return(true);
            }
            else
            {
                Logger.WriteError(string.Format("There are 0 stations queued for download from {0} subscribed lineups. Exiting.", clientLineups.Lineups.Count));
                Logger.WriteError("Check that lineups are 'INCLUDED' and stations are selected in the EPG123 GUI.");
                return(false);
            }
        }