public JobScheduleInfo FindJob(string detail, string epg = null) { // May need to recreate the identifier if (detail.StartsWith("*")) { if (detail.Length == 1) { detail = Guid.NewGuid().ToString("N") + Guid.NewGuid().ToString("N"); } else { detail = detail.Substring(1, 32) + Guid.NewGuid().ToString("N"); } } // Parameter analysieren var schedule = ServerRuntime.ParseUniqueWebId(detail, out VCRJob job); // See if we have to initialize from program guide ProgramGuideEntry epgEntry = null; string profile = null; if (!string.IsNullOrEmpty(epg)) { // Get parts var epgInfo = epg.Split(':'); // Locate epgEntry = ServerRuntime.VCRServer.FindProgramGuideEntry(profile = epgInfo[1], SourceIdentifier.Parse(epgInfo[2]), new DateTime(long.Parse(epgInfo[0]), DateTimeKind.Utc)); } // Information erzeugen return(JobScheduleInfo.Create(job, schedule, epgEntry, profile)); }
/// <summary> /// Erstellt einen neuen Eintrag für die Programmzeitschrift. /// </summary> /// <param name="entry">Der originale Eintrag aus der Verwaltung.</param> /// <param name="profileName">Der Name des zugehörigen Geräteprofils.</param> /// <returns>Die gewünschte Beschreibung.</returns> public static GuideItem Create(ProgramGuideEntry entry, string profileName) { // Validate if (entry == null) { throw new ArgumentNullException("entry"); } // Default name of the station var source = VCRProfiles.FindSource(profileName, entry.Source); // Create return (new GuideItem { Identifier = string.Format("{0}:{1}:{2}", entry.StartTime.Ticks, profileName, SourceIdentifier.ToString(entry.Source).Replace(" ", "")), Station = (source == null) ? entry.StationName : source.GetUniqueName(), Duration = TimeSpan.FromSeconds(entry.Duration), Categories = entry.Categories.ToArray(), Ratings = entry.Ratings.ToArray(), Summary = entry.ShortDescription, Description = entry.Description, StartTime = entry.StartTime, Language = entry.Language, Name = entry.Name, }); }
/// <summary> /// Legt eine neue Information an. /// </summary> /// <param name="job">Der Auftrag.</param> /// <param name="schedule">Die Aufzeichnung.</param> /// <param name="guide">Ein Eintrag der Programmzeitschrift.</param> /// <param name="profile">Vorgabe für das Geräteprofil.</param> /// <returns>Die Information.</returns> public static JobScheduleInfo Create(VCRJob job, VCRSchedule schedule, ProgramGuideEntry guide, string profile) { // Process return (new JobScheduleInfo { ScheduleIdentifier = (schedule == null) ? null : schedule.UniqueID.Value.ToString("N"), JobIdentifier = (job == null) ? null : job.UniqueID.Value.ToString("N"), Schedule = EditSchedule.Create(schedule, job, guide), Job = EditJob.Create(job, guide, profile), }); }
/// <summary> /// Erstellt eine neue Beschreibung. /// </summary> /// <param name="job">Der konkrete Auftag.</param> /// <param name="guide">Ein Eintrag der Programmzeitschrift.</param> /// <param name="profile">Vorgabe für das Geräteprofil.</param> /// <returns>Die zugehörige Beschreibung.</returns> public static EditJob Create(VCRJob job, ProgramGuideEntry guide, string profile) { // Process if (job == null) { // No hope if (guide == null) { return(null); } // Create from program guide return (new EditJob { Source = ServerRuntime.VCRServer.GetUniqueName(new SourceSelection { ProfileName = profile, Source = guide.Source }), DVBSubtitles = UserProfileSettings.UseSubTitles, DolbyDigital = UserProfileSettings.UseAC3, AllLanguages = UserProfileSettings.UseMP2, Videotext = UserProfileSettings.UseTTX, UseProfileForRecording = false, Name = guide.Name.MakeValid(), Profile = profile, }); } // Optionen ermitteln var streams = job.Streams; var sourceName = ServerRuntime.VCRServer.GetUniqueName(job.Source); // Report return (new EditJob { UseProfileForRecording = !job.AutomaticResourceSelection, DolbyDigital = streams.GetUsesDolbyAudio(), AllLanguages = streams.GetUsesAllAudio(), DVBSubtitles = streams.GetUsesSubtitles(), Videotext = streams.GetUsesVideotext(), RecordingDirectory = job.Directory, Profile = job.Source.ProfileName, Source = sourceName, Name = job.Name, }); }
/// <summary> /// Erstellt eine Beschreibung zu dieser Aufzeichnung. /// </summary> /// <param name="schedule">Eine Aufzeichnung.</param> /// <param name="job">Der bereits vorhandene Auftrag.</param> /// <param name="guide">Ein Eintrag aus der Programmzeitschrift.</param> /// <returns>Die gewünschte Beschreibung.</returns> public static EditSchedule Create(VCRSchedule schedule, VCRJob job, ProgramGuideEntry guide) { // None if (schedule == null) { // No hope if (guide == null) { return(null); } // Calculate var start = guide.StartTime - TimeSpan.FromMinutes(UserProfileSettings.EPGPreTime); var duration = checked ((int)(UserProfileSettings.EPGPreTime + (guide.Duration / 60) + UserProfileSettings.EPGPostTime)); // Partial - we have a brand new job which is pre-initialized with the source if (job == null) { return new EditSchedule { FirstStart = start, Duration = duration } } ; // Full monty - we have to overwrite the jobs settings since we are not the first schedule return (new EditSchedule { Source = ServerRuntime.VCRServer.GetUniqueName(new SourceSelection { ProfileName = job.Source.ProfileName, Source = guide.Source }), DVBSubtitles = UserProfileSettings.UseSubTitles, DolbyDigital = UserProfileSettings.UseAC3, AllLanguages = UserProfileSettings.UseMP2, Videotext = UserProfileSettings.UseTTX, Name = guide.Name.MakeValid(), Duration = duration, FirstStart = start, }); } // Consolidate exceptions schedule.CleanupExceptions(); // Optionen ermitteln var streams = schedule.Streams; var sourceName = ServerRuntime.VCRServer.GetUniqueName(schedule.Source); // Create return (new EditSchedule { Exceptions = schedule.Exceptions.Select(exception => PlanException.Create(exception, schedule)).ToArray(), LastDay = schedule.LastDay.GetValueOrDefault(VCRSchedule.MaxMovableDay), DolbyDigital = streams.GetUsesDolbyAudio(), DVBSubtitles = streams.GetUsesSubtitles(), AllLanguages = streams.GetUsesAllAudio(), Videotext = streams.GetUsesVideotext(), FirstStart = schedule.FirstStart, RepeatPattern = schedule.Days, Duration = schedule.Duration, Name = schedule.Name, Source = sourceName, }); }
/// <summary> /// Beendet die Sammlung endgültig. /// </summary> protected override void OnStop() { // At least we tried ProfileState.ProgramGuide.LastUpdateTime = DateTime.UtcNow; // Report Tools.ExtendedLogging("Converting Program Guide Entries from Card Server to VCR.NET Format"); // Create result var result = new ProgramGuideEntries(); // Fill it foreach (var item in Server.BeginEndEPGCollection().Result) { // Create event var epg = new ProgramGuideEntry { TransportIdentifier = item.Source.TransportStream, ShortDescription = item.ShortDescription, NetworkIdentifier = item.Source.Network, ServiceIdentifier = item.Source.Service, Description = item.Description, Duration = item.Duration, Language = item.Language, StartTime = item.Start, Name = item.Name }; // Finish if (item.Content != null) { epg.Categories.AddRange(item.Content.Select(c => c.ToString())); } if (item.Ratings != null) { epg.Ratings.AddRange(item.Ratings); } // Resolve var source = VCRProfiles.FindSource(ProfileName, item.Source); if (source == null) { // Load default epg.StationName = item.Source.ToString(); } else { // Attach to the station var station = (Station)source.Source; // Load names epg.StationName = station.Name; } // Add it result.Add(epg); } // Report ProfileState.ProgramGuide.UpdateGuide(result); }