/// <summary> /// Erstellt eine neue Beschreibung aus dem Aufzeichnungsplan. /// </summary> /// <param name="plan">Die Planung der Aufzeichnung.</param> /// <param name="context">Die aktuelle Analyseumgebung.</param> /// <param name="server">Der zugehörige Dienst.</param> /// <returns>Die gewünschte Beschreibung.</returns> public static PlanCurrent Create(IScheduleInformation plan, PlanContext context, VCRServer server) { // Attach to the definition var definition = (IScheduleDefinition <VCRSchedule>)plan.Definition; var job = context.TryFindJob(definition.UniqueIdentifier); var schedule = (job == null) ? null : job[definition.UniqueIdentifier]; var source = (schedule == null) ? null : (schedule.Source ?? job.Source); // Create var planned = new PlanCurrent { Identifier = (schedule == null) ? null : ServerRuntime.GetUniqueWebId(job, schedule), ProfileName = plan.Resource.Name, Duration = plan.Time.Duration, StartTime = plan.Time.Start, IsLate = plan.StartsLate, SizeHint = string.Empty, Name = definition.Name, m_source = source, Files = _NoFiles, Index = -1, }; // Finish planned.Complete(server); // Report return(planned); }
public string CreateNewJob([FromBody] JobScheduleData data) { // Reconstruct var job = data.Job.CreateJob(); var schedule = data.Schedule.CreateSchedule(job); // See if we can use it if (!schedule.IsActive) { throw new ArgumentException(Properties.Resources.ScheduleInPast); } // Connect job.Schedules.Add(schedule); // Process ServerRuntime.VCRServer.UpdateJob(job, schedule.UniqueID.Value); // Update recently used channels UserProfileSettings.AddRecentChannel(data.Job.Source); UserProfileSettings.AddRecentChannel(data.Schedule.Source); // Report return(ServerRuntime.GetUniqueWebId(job, schedule)); }
/// <summary> /// Meldet die Daten zu einer Aufzeichnung. /// </summary> /// <param name="schedule">Die Aufzeichnung.</param> /// <param name="job">Der zugehörige Auftrag.</param> /// <returns></returns> public static InfoSchedule Create(VCRSchedule schedule, VCRJob job) { // Create return (new InfoSchedule { Source = (schedule.Source ?? job.Source).GetUniqueName(), WebId = ServerRuntime.GetUniqueWebId(job, schedule), StartTime = schedule.FirstStart, RepeatPattern = schedule.Days, Duration = schedule.Duration, Name = schedule.Name, }); }
/// <summary> /// Erstellt eine neue Beschreibung. /// </summary> /// <param name="job">Ein Auftrag.</param> /// <param name="active">Gesetzt, wenn es sich um einen aktiven Auftrag handelt.</param> /// <returns>Die gewünschte Beschreibung.</returns> public static InfoJob Create(VCRJob job, bool active) { // Report return (new InfoJob { Schedules = job.Schedules.Select(schedule => InfoSchedule.Create(schedule, job)).OrderBy(schedule => schedule.Name ?? string.Empty, StringComparer.InvariantCultureIgnoreCase).ToArray(), WebId = ServerRuntime.GetUniqueWebId(job, null), ProfileName = job.Source.ProfileName, SourceName = job.Source.DisplayName, IsActive = active, Name = job.Name, }); }
/// <summary> /// Erstellt eine Beschreibung zu einer einzelnen Aufzeichnung auf einem Gerät. /// </summary> /// <param name="active">Beschreibt die gesamte Aufzeichnung.</param> /// <param name="stream">Die zu verwendende Teilaufzeichnung.</param> /// <param name="streamIndex">Die laufende Nummer dieses Datenstroms.</param> /// <param name="server">Der zugehörige Dienst.</param> /// <returns>Die gewünschte Beschreibung.</returns> private static IEnumerable <PlanCurrent> Create(FullInfo active, StreamInfo stream, int streamIndex, VCRServer server) { // Static data var recording = active.Recording; var profileName = recording.Source.ProfileName; var sizeHint = GetSizeHint(recording.TotalSize) + " (Gerät)"; // Process all - beginning with VCR.NET 4.1 there is only one schedule per stream foreach (var scheduleInfo in stream.Schedules) { // Try to locate the context var job = string.IsNullOrEmpty(scheduleInfo.JobUniqueID) ? null : server.JobManager[new Guid(scheduleInfo.JobUniqueID)]; var schedule = ((job == null) || string.IsNullOrEmpty(scheduleInfo.ScheduleUniqueID)) ? null : job[new Guid(scheduleInfo.ScheduleUniqueID)]; // Create var start = RoundToSecond(scheduleInfo.StartsAt); var end = RoundToSecond(scheduleInfo.EndsAt); var current = new PlanCurrent { Identifier = (schedule == null) ? null : ServerRuntime.GetUniqueWebId(job, schedule), PlanIdentifier = scheduleInfo.ScheduleUniqueID, Files = scheduleInfo.Files ?? _NoFiles, StreamTarget = stream.StreamsTo, m_source = scheduleInfo.Source, ProfileName = profileName, Name = scheduleInfo.Name, Duration = end - start, Index = streamIndex, SizeHint = sizeHint, StartTime = start, }; // Finish current.Complete(server); // Report yield return(current); } }
public string CreateNewRecording(string detail, [FromBody] JobScheduleData data) { // Parameter analysieren VCRJob job; ServerRuntime.ParseUniqueWebId(detail + Guid.NewGuid().ToString("N"), out job); // Validate if (job == null) { throw new ArgumentException("Job not found"); } // Take the new job data var newJob = data.Job.CreateJob(job.UniqueID.Value); var newSchedule = data.Schedule.CreateSchedule(newJob); // See if we can use it if (!newSchedule.IsActive) { throw new ArgumentException(Properties.Resources.ScheduleInPast); } // Add all existing newJob.Schedules.AddRange(job.Schedules); // Add the new one newJob.Schedules.Add(newSchedule); // Send to persistence ServerRuntime.VCRServer.UpdateJob(newJob, newSchedule.UniqueID.Value); // Update recently used channels UserProfileSettings.AddRecentChannel(data.Job.Source); UserProfileSettings.AddRecentChannel(data.Schedule.Source); // Report return(ServerRuntime.GetUniqueWebId(newJob, newSchedule)); }
/// <summary> /// Erstellt einen neuen Eintrag. /// </summary> /// <param name="schedule">Die zugehörige Beschreibung der geplanten Aktivität.</param> /// <param name="context">Die Abbildung auf die Aufträge.</param> /// <param name="profiles">Die Verwaltung der Geräteprofile.</param> /// <returns>Die angeforderte Repräsentation.</returns> public static PlanActivity Create(IScheduleInformation schedule, PlanContext context, ProfileStateCollection profiles) { // Request context information var definition = schedule.Definition; var runningInfo = context.GetRunState(definition.UniqueIdentifier); var isAllocation = definition is IResourceAllocationInformation; // Maybe it's an resource allocation if (isAllocation) { if (runningInfo != null) { definition = runningInfo.Schedule.Definition; } else { return(null); } } // Create initial entry var time = schedule.Time; var start = time.Start; var end = time.End; var activity = new PlanActivity { IsHidden = (schedule.Resource == null), IsLate = schedule.StartsLate, }; // May need some correction if (runningInfo != null) { if (end == runningInfo.Schedule.Time.End) { // Only report the allocation itself if (!isAllocation) { return(null); } // Reload the real start and times - just in case someone manipulated start = runningInfo.Schedule.Time.Start; end = runningInfo.RealTime.End; // Never report as late - actually since we have some spin up time most of the time the recording is late activity.IsLate = false; } } // Get the beautified range start = PlanCurrent.RoundToSecond(start); end = PlanCurrent.RoundToSecond(end); // Set times activity.Duration = end - start; activity.StartTime = start; // Set name if (definition != null) { activity.FullName = definition.Name; } // Set resource var resource = schedule.Resource; if (resource != null) { activity.Device = resource.Name; } // Schedule to process VCRSchedule vcrSchedule = null; VCRJob vcrJob = null; // Analyse definition var scheduleDefinition = definition as IScheduleDefinition <VCRSchedule>; if (scheduleDefinition != null) { // Regular plan vcrSchedule = scheduleDefinition.Context; vcrJob = context.TryFindJob(vcrSchedule); } // Process if we found one if (vcrSchedule != null) { // See if we have a job if (vcrJob != null) { activity.LegacyReference = ServerRuntime.GetUniqueWebId(vcrJob, vcrSchedule); } // Find the source to use - stream selection is always bound to the context of the source var streams = vcrSchedule.Streams; var source = vcrSchedule.Source; if (source == null) { if (vcrJob != null) { // Try job source = vcrJob.Source; // Adjust stream flags to use if (source == null) { streams = null; } else { streams = vcrJob.Streams; } } } // Copy station name if (source != null) { // Remember activity.Source = SourceIdentifier.ToString(source.Source).Replace(" ", ""); activity.Station = source.DisplayName; // Load the profile var profile = profiles[activity.GuideEntryDevice = source.ProfileName]; if (profile != null) { activity.HasGuideEntry = profile.ProgramGuide.HasEntry(source.Source, activity.StartTime, activity.StartTime + activity.Duration); } } // Apply special settings activity.CurrentProgramGuide = streams.GetUsesProgramGuide(); activity.AllLanguages = streams.GetUsesAllAudio(); activity.SubTitles = streams.GetUsesSubtitles(); activity.VideoText = streams.GetUsesVideotext(); activity.Dolby = streams.GetUsesDolbyAudio(); // Check for exception rule on the day var exception = vcrSchedule.FindException(time.End); if (exception != null) { activity.ExceptionRule = PlanException.Create(exception, vcrSchedule); } // May want to add end time checks if (!isAllocation) { if (!activity.IsLate) { if (!activity.IsHidden) { if ((exception == null) || exception.IsEmpty) { activity.EndTimeCouldBeWrong = activity.CheckEndTime(vcrSchedule.FirstStart); } } } } } else if (definition is ProgramGuideTask) { activity.Station = VCRJob.ProgramGuideName; } else if (definition is SourceListTask) { activity.Station = VCRJob.SourceScanName; } // Report return(activity); }