// Helper TVProgramme TVProgrammeFromWtvFile(string filename) { TVProgramme tvp = new TVProgramme(); tvp.isGeneratedFromFile = true; DvrmsMetadataEditor MetaEd = new DvrmsMetadataEditor(filename); try { tvp.Filename = filename; Dictionary<string, MetadataItem> attributes = new Dictionary<string, MetadataItem>(); if (!MetaEd.GetMetaData(ref attributes)) return null; // Title if (attributes.ContainsKey("Title")) { MetadataItem Mtitle = attributes["Title"]; tvp.Title = (string)Mtitle.Value; } else tvp.Title = "Untitled Show"; /* if (attributes.ContainsKey("WM/WMRVProgramID")) { // Use the file ID as it will persist MetadataItem Mid = attributes["WM/WMRVProgramID"]; string strID = (string)Mid.Value; // Strip any !! bit int locExcl = strID.LastIndexOf("!"); if (locExcl > 0) tvp.Id = strID.Substring(locExcl + 1); else tvp.Id = strID; } else */ // THIS WAS CAUSING SD AND HD SHOWS TO MERGE { // Make up an ID Random r = new Random(); int iRan = r.Next(100000000, 900000000); string addendum = ""; if ((tvp.Title != null) && (tvp.Title.Length > 4)) addendum += tvp.Title.Substring(0, 3); tvp.Id = iRan.ToString() + addendum; } // Episode Title if (attributes.ContainsKey("WM/SubTitle")) { MetadataItem Msubtitle = attributes["WM/SubTitle"]; if (Msubtitle.Value != null) tvp.EpisodeTitle = (string)Msubtitle.Value; } else tvp.EpisodeTitle = ""; // Description if (attributes.ContainsKey("WM/SubTitleDescription")) { MetadataItem Mdesc = attributes["WM/SubTitleDescription"]; if (Mdesc.Value != null) tvp.Description = (string)Mdesc.Value; } if (attributes.ContainsKey("WM/MediaIsSport")) { MetadataItem Msport = attributes["WM/MediaIsSport"]; if (Msport.Value != null) { bool isSport = (bool)Msport.Value; if (isSport) tvp.ProgramType = TVProgrammeType.Sport; } } if (attributes.ContainsKey("WM/MediaIsMovie")) { MetadataItem MisMovie = attributes["WM/MediaIsMovie"]; if (MisMovie.Value != null) { bool isMovie = (bool)MisMovie.Value; if (isMovie) tvp.ProgramType = TVProgrammeType.Movie; } } if (attributes.ContainsKey("WM/WMRVEncodeTime")) { MetadataItem Mdate = attributes["WM/WMRVEncodeTime"]; if (Mdate.Value != null) { try { long tickTime = (long)Mdate.Value; DateTime TheStartTime = new DateTime(tickTime, DateTimeKind.Utc); tvp.StartTime = TheStartTime.Ticks; } catch (Exception ex) { Functions.WriteLineToLogFile("Error setting start time from WTV metadata for file " + filename); Functions.WriteExceptionToLogFile(ex); } } } else { Functions.WriteLineToLogFile("No start time in WTV metadata for file " + filename + " - using current time."); tvp.StartTime = DateTime.Now.ToUniversalTime().Ticks; } if (attributes.ContainsKey("WM/WMRVEndTime")) { MetadataItem Menddate = attributes["WM/WMRVEndTime"]; if (Menddate.Value != null) { long tickTime = (long)Menddate.Value; DateTime TheEndTime = new DateTime(tickTime, DateTimeKind.Utc); tvp.StopTime = TheEndTime.Ticks; } } else { Functions.WriteLineToLogFile("No end time in WTV metadata for file " + filename + " - using current time plus 5 seconds."); tvp.StopTime = DateTime.Now.AddMinutes(5).ToUniversalTime().Ticks; } if (attributes.ContainsKey("WM/WMRVContentProtectedPercent")) { MetadataItem Mprotected = attributes["WM/WMRVContentProtectedPercent"]; if (Mprotected.Value != null) { int percentProtected = (int)Mprotected.Value; if (percentProtected > 0) tvp.IsDRMProtected = true; } } if (attributes.ContainsKey("WM/MediaStationCallSign")) { MetadataItem Mchannel = attributes["WM/MediaStationCallSign"]; if (Mchannel.Value != null) { tvp.WTVCallsign = (string)Mchannel.Value; } } // Only populate if we don't already have a callsign if (string.IsNullOrEmpty(tvp.WTVCallsign)) { if (attributes.ContainsKey("WM/MediaStationName")) // Added by request: also use station name { MetadataItem Mchanname = attributes["WM/MediaStationName"]; if (Mchanname.Value != null) tvp.WTVCallsign = (string)Mchanname.Value; } else { tvp.WTVCallsign = "Unknown channel."; } } if (attributes.ContainsKey("WM/WMRVSeriesUID")) { MetadataItem MSeriesUID = attributes["WM/WMRVSeriesUID"]; if (MSeriesUID.Value != null) tvp.IsSeries = !String.IsNullOrEmpty((string)MSeriesUID.Value); } if (attributes.ContainsKey("WM/WMRVHDContent")) { MetadataItem MisHD = attributes["WM/WMRVHDContent"]; if (MisHD.Value != null) tvp.IsHD = (bool)MisHD.Value; } if (attributes.ContainsKey("WM/MediaIsSubtitled")) { MetadataItem MisSubT = attributes["WM/MediaIsSubtitled"]; if (MisSubT.Value != null) tvp.HasSubtitles = (bool)MisSubT.Value; } // Original date if (attributes.ContainsKey("WM/MediaOriginalBroadcastDateTime")) { MetadataItem Morigdate = attributes["WM/MediaOriginalBroadcastDateTime"]; if (Morigdate.Value != null) { string strOrigDate = (string)Morigdate.Value; if (!string.IsNullOrWhiteSpace(strOrigDate)) { DateTime dtOrigDate; if (DateTime.TryParse(strOrigDate, out dtOrigDate)) { tvp.OriginalAirDate = dtOrigDate.ToUniversalTime().Ticks; } else { if (Settings.Default.DebugAdvanced) Functions.WriteLineToLogFile("Couldn't parse WTV original broadcast date for " + filename + ": [" + strOrigDate + "]"); } } } } if (attributes.ContainsKey("WM/MediaIsRepeat")) { MetadataItem MisRepeat = attributes["WM/MediaIsRepeat"]; if (MisRepeat.Value != null) { bool isRepeat = (bool)MisRepeat.Value; tvp.IsFirstShowing = !isRepeat; } } } catch (Exception ex) { if (Settings.Default.DebugAdvanced) { Functions.WriteLineToLogFile("Couldn't get WTV metadata for " + filename + ":"); Functions.WriteExceptionToLogFile(ex); } return null; } finally { MetaEd.ReleaseResources(); MetaEd = null; } return tvp; }
/// <summary>Splices together all of the spans.</summary> /// <returns></returns> protected override object DoWork() { IStreamBufferRecComp recComp = null; Timer timer = null; try { // Timer used for updating progress timer = new Timer(new TimerCallback(HandleProgressUpdate), null, PollFrequency, PollFrequency); // Create the RecComp and initialize it recComp = (IStreamBufferRecComp)ClassId.CoCreateInstance(ClassId.RecComp); if (File.Exists(_target.FullName)) File.Delete(_target.FullName); recComp.Initialize(_target.FullName, _spans[0].File.FullName); _recComp = recComp; // only valid during this call // Add each span to the output file FileInfo dvrTarget = _target; for(int i=0; i<_spans.Count; i++) { // If the user has requested cancellation, stop processing if (CancellationPending) break; // Do the append VideoSpan span = _spans[i]; ulong start = VideoSpan.SecondsToHundredNanoseconds(span.StartPosition); ulong stop = VideoSpan.SecondsToHundredNanoseconds(span.StopPosition); recComp.AppendEx(span.File.FullName, start, stop); } } finally { // Clean up after the RecComp object and the timer if (timer != null) timer.Dispose(); if (recComp != null) recComp.Close(); while(Marshal.ReleaseComObject(recComp) > 0); } // Copy the metadata if requested... use that from the first span. if (_copyMetadata) { using(MetadataEditor sourceEditor = new DvrmsMetadataEditor(_spans[0].File.FullName)) { using(MetadataEditor destEditor = new AsfMetadataEditor(_target.FullName)) { MetadataEditor.MigrateMetadata(sourceEditor, destEditor); } } } // Notify that we're done OnProgressChanged(100); return null; }
public override void ProcessFile(string file) { OMLSDKTitle newTitle = new OMLSDKTitle(); String fPath = Path.GetDirectoryName(file); newTitle.Name = Path.GetFileNameWithoutExtension(file); IDictionary meta; DvrmsMetadataEditor editor = new DvrmsMetadataEditor(file); meta = editor.GetAttributes(); foreach (string item in meta.Keys) { MetadataItem attr = (MetadataItem)meta[item]; switch (item) { case DvrmsMetadataEditor.Title: string sTitle = (string)attr.Value; sTitle = sTitle.Trim(); if (!String.IsNullOrEmpty(sTitle)) { newTitle.Name = sTitle; } newTitle.ImporterSource = @"DVRMSImporter"; newTitle.MetadataSourceName = @"DVR-MS"; OMLSDKDisk disk = new OMLSDKDisk(); string ext = Path.GetExtension(file).Substring(1).Replace(@"-", @""); disk.Format = (OMLSDKVideoFormat)Enum.Parse(typeof(OMLSDKVideoFormat), ext, true); SDKUtilities.DebugLine("[DVRMSPlugin] Adding file: " + Path.GetFullPath(file)); disk.Path = Path.GetFullPath(file); disk.Name = @"Disk 1"; newTitle.AddDisk(disk); //newTitle.FileLocation = file; if (!String.IsNullOrEmpty(newTitle.AspectRatio)) { newTitle.AspectRatio = @"Widescreen"; } //string ext = Path.GetExtension(file).Substring(1).Replace(@"-", @""); //newTitle.VideoFormat = (VideoFormat)Enum.Parse(typeof(VideoFormat), ext, true); string cover = fPath + @"\" + Path.GetFileNameWithoutExtension(file) + @".jpg"; if (File.Exists(cover)) { SDKUtilities.DebugLine("[DVRMSPlugin] Setting CoverArt: " + Path.GetFullPath(cover)); newTitle.FrontCoverPath = Path.GetFullPath(cover); //newTitle.FrontCoverPath = cover; } else { SDKUtilities.DebugLine("[DVRMSPlugin] No coverart found"); } break; case DvrmsMetadataEditor.MediaOriginalBroadcastDateTime: string sDT = (string)attr.Value; if (!String.IsNullOrEmpty(sDT)) { DateTime dt; if (DateTime.TryParse(sDT, out dt)) { newTitle.ReleaseDate = dt; } } break; case DvrmsMetadataEditor.Genre: if (!String.IsNullOrEmpty((string)attr.Value)) { string sGenre = (string)attr.Value; string[] gen = sGenre.Split(','); newTitle.Genres.Clear(); foreach (string genre in gen) { string uGenre = genre.ToUpper().Trim(); if (String.IsNullOrEmpty(uGenre)) continue; if (uGenre.StartsWith(@"MOVIE")) continue; uGenre = genre.Trim(); newTitle.AddGenre(uGenre); } } break; case DvrmsMetadataEditor.Duration: Int64 rTime = (long)attr.Value; rTime = rTime / 600 / 1000000; newTitle.Runtime = (int)rTime; break; case DvrmsMetadataEditor.ParentalRating: if (!String.IsNullOrEmpty((string)attr.Value)) { newTitle.ParentalRating = (string)attr.Value; } break; case DvrmsMetadataEditor.Credits: string persona = (string)attr.Value; persona += @";;;;"; string[] credits = persona.Split(';'); string[] cast = credits[0].Split('/'); foreach (string nm in cast) { if (!String.IsNullOrEmpty(nm)) newTitle.AddActingRole(nm, ""); } string[] dirs = credits[1].Split('/'); if (dirs.Length > 0) { if (!String.IsNullOrEmpty(dirs[0])) { string nm = dirs[0]; newTitle.AddDirector(new OMLSDKPerson(nm)); } } break; case DvrmsMetadataEditor.SubtitleDescription: newTitle.Synopsis = (string)attr.Value; break; } attr = null; } if (ValidateTitle(newTitle)) { try { if (String.IsNullOrEmpty(newTitle.Name)) { newTitle.Name = Path.GetFileNameWithoutExtension(file); newTitle.ImporterSource = @"DVRMSImporter"; newTitle.MetadataSourceName = @"DVR-MS"; OMLSDKDisk disk = new OMLSDKDisk(); disk.Name = @"Disk 1"; disk.Path = file; //newTitle.FileLocation = file; string ext = Path.GetExtension(file).Substring(1).Replace(@"-", @""); //newTitle.VideoFormat = (VideoFormat)Enum.Parse(typeof(VideoFormat), ext, true); disk.Format = (OMLSDKVideoFormat)Enum.Parse(typeof(OMLSDKVideoFormat), ext, true); newTitle.AddDisk(disk); string cover = fPath + @"\" + Path.GetFileNameWithoutExtension(file) + @".jpg"; if (File.Exists(Path.GetFullPath(cover))) { SDKUtilities.DebugLine("[DVRMSPlugin] Setting CoverArt: " + Path.GetFullPath(cover)); newTitle.FrontCoverPath = cover; } else { SDKUtilities.DebugLine("[DVRMSPlugin] No coverart found"); } } if (String.IsNullOrEmpty(newTitle.AspectRatio)) { newTitle.AspectRatio = @"Widescreen"; } if (String.IsNullOrEmpty(newTitle.ParentalRating)) { newTitle.ParentalRating = @"--"; } AddTitle(newTitle); } catch (Exception e) { Trace.WriteLine("[DVRMSPlugin] Error adding row: " + e.Message); } } else { Trace.WriteLine("[DVRMSPlugin] Error saving row"); } }