private Recording BuildRecordingFromTag(string aFileName, MatroskaTagInfo aTag) { Recording tagRec = null; try { string physicalFile = GetRecordingFilename(aFileName); tagRec = new Recording(GetChannelIdByDisplayName(aTag.channelName), GetRecordingStartTime(physicalFile), GetRecordingEndTime(physicalFile), aTag.title, aTag.description, aTag.genre, physicalFile, 0, SqlDateTime.MaxValue.Value, 0, GetServerId() ); } catch (Exception ex) { MessageBox.Show(string.Format("Could not build recording from tag: {0}\n{1}", aFileName, ex.Message)); } return(tagRec); }
private void TsCopier(object itemlist, Recording rec, Schedule newSchedule) { string[] bufferListObject; bufferListObject = new string[3]; List <string[]> _itemlist = (List <string[]>)itemlist; bool foundHeader = false; bufferListObject = _itemlist[0]; string targetTs = Path.GetDirectoryName(bufferListObject[2]) + "\\" + Path.GetFileNameWithoutExtension(bufferListObject[2]) + "_buffer.ts"; bool success = false; _filename = bufferListObject[2]; try { Log.Info("TsCopier: targetTs {0}", targetTs); using (FileStream writer = new FileStream(targetTs, FileMode.CreateNew, FileAccess.Write)) { for (int i = 0; i < _itemlist.Count; i++) { bufferListObject = _itemlist[i]; try { if (File.Exists(bufferListObject[0])) { using (FileStream reader = new FileStream(bufferListObject[0], FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { Log.Info("TsCopier: TSfilename {0}", bufferListObject[0]); Log.Debug("TsCopier: TSfilename filesize {0}", bufferListObject[1]); if (!foundHeader) { byte[] prebuf = new byte[1024 * 1024]; int bytesPreRead; bytesPreRead = reader.Read(prebuf, 0, 1024 * 1024); long position = 0; // find TS packet header while (bytesPreRead > 0 && !foundHeader) { for (int x = 0; x < 1024 * 1024 - 376; x++) { if (prebuf[x] == 0x47 && prebuf[x + 188] == 0x47 && prebuf[x + 376] == 0x47) { Log.Debug("TsCopier: TS packet header found at {0} pos in {1}.", x, bufferListObject[0]); position = x; foundHeader = true; break; } } bytesPreRead = reader.Read(prebuf, 0, 1024 * 1024); } reader.Position = position; if (!foundHeader) { Log.Debug("TsCopier: TS packet header not found in {0}.", bufferListObject[0]); break; } } byte[] buf = new byte[1024 * 1024]; int bytesRead = reader.Read(buf, 0, 1024 * 1024); while (bytesRead > 0) { if (reader.Position > Convert.ToInt64(bufferListObject[1])) { bytesRead -= (int)(reader.Position - Convert.ToInt64(bufferListObject[1])); } if (bytesRead <= 0) { break; } writer.Write(buf, 0, bytesRead); bytesRead = reader.Read(buf, 0, 1024 * 1024); Thread.Sleep(100); } reader.Close(); } } success = true; } catch (Exception ex) { Log.Error("TsCopier exception: {0}", ex); } } writer.Flush(); writer.Close(); var layer = new TvBusinessLayer(); String TsBufferExtractorFileSetup = layer.GetSetting("TsBufferExtractorFileSetup", "A").Value; if (success && (TsBufferExtractorFileSetup == "B" || TsBufferExtractorFileSetup == "C")) { Thread mergefilesThread; mergefilesThread = new Thread(mergeThread); mergefilesThread.Priority = ThreadPriority.Lowest; mergefilesThread.IsBackground = true; mergefilesThread.Start(_filename); } if (success && (TsBufferExtractorFileSetup == "A" || TsBufferExtractorFileSetup == "C")) { try { Log.Debug("TsCopier: Creating Recording entry for {0}", targetTs); RecordingDetail recDetail = new RecordingDetail(newSchedule, newSchedule.ReferencedChannel(), DateTime.Now, false); recDetail.Recording = new Recording(recDetail.Schedule.IdChannel, recDetail.Schedule.IdSchedule, false, rec.StartTime, DateTime.Now, rec.Title + " (from buffer)", recDetail.Program.Description, recDetail.Program.Genre, targetTs, recDetail.Schedule.KeepMethod, recDetail.Schedule.KeepDate, 0, rec.IdServer, recDetail.Program.EpisodeName, recDetail.Program.SeriesNum, recDetail.Program.EpisodeNum, recDetail.Program.EpisodePart); recDetail.Recording.Persist(); IUser user = recDetail.User; TsBufferExtractor.Controller.Fire(this, new TvServerEventArgs(TvServerEventType.RecordingEnded, new VirtualCard(user), (User)user, recDetail.Schedule, recDetail.Recording)); MatroskaTagInfo info = new MatroskaTagInfo(); info.title = rec.Title + " (from buffer)"; info.description = recDetail.Program.Description; info.genre = recDetail.Program.Genre; info.channelName = recDetail.Schedule.ReferencedChannel().DisplayName; info.episodeName = recDetail.Program.EpisodeName; info.seriesNum = recDetail.Program.SeriesNum; info.episodeNum = recDetail.Program.EpisodeNum; info.episodePart = recDetail.Program.EpisodePart; info.startTime = rec.StartTime; info.endTime = DateTime.Now; MatroskaTagHandler.WriteTag(Path.ChangeExtension(targetTs, ".xml"), info); } catch (Exception ex) { Log.Error("TsCopier Exception: {0}", ex); } } if (success && TsBufferExtractorFileSetup == "C") { try { String mergedName = _filename + "_merged.ts"; Log.Debug("TsCopier: Creating Recording entry for {0}", mergedName); RecordingDetail recDetail = new RecordingDetail(newSchedule, newSchedule.ReferencedChannel(), DateTime.Now, false); recDetail.Recording = new Recording(recDetail.Schedule.IdChannel, recDetail.Schedule.IdSchedule, false, rec.StartTime, DateTime.Now, rec.Title + " (merged)", recDetail.Program.Description, recDetail.Program.Genre, mergedName, recDetail.Schedule.KeepMethod, recDetail.Schedule.KeepDate, 0, rec.IdServer, recDetail.Program.EpisodeName, recDetail.Program.SeriesNum, recDetail.Program.EpisodeNum, recDetail.Program.EpisodePart); recDetail.Recording.Persist(); IUser user = recDetail.User; TsBufferExtractor.Controller.Fire(this, new TvServerEventArgs(TvServerEventType.RecordingEnded, new VirtualCard(user), (User)user, recDetail.Schedule, recDetail.Recording)); MatroskaTagInfo info = new MatroskaTagInfo(); info.title = rec.Title + " (merged)"; info.description = recDetail.Program.Description; info.genre = recDetail.Program.Genre; info.channelName = recDetail.Schedule.ReferencedChannel().DisplayName; info.episodeName = recDetail.Program.EpisodeName; info.seriesNum = recDetail.Program.SeriesNum; info.episodeNum = recDetail.Program.EpisodeNum; info.episodePart = recDetail.Program.EpisodePart; info.startTime = rec.StartTime; info.endTime = DateTime.Now; MatroskaTagHandler.WriteTag(Path.ChangeExtension(mergedName, ".xml"), info); } catch (Exception ex) { Log.Error("TsCopier Exception: {0}", ex); } } Log.Info("TsCopier: Done {0}", targetTs); } } catch (Exception ex) { Log.Error("TsCopier Exception: {0}", ex); } }