using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MySqlConnector; using skyscraper5.Scte35; using skyscraper5.Scte35.Descriptors; using skyscraper8.Skyscraper.Scraper.Storage; namespace skyscraper5.Data.MySql { public partial class MySqlDataStorage : DataStorage { private void InsertScte35SpliceComponents(MySqlTransaction transaction, int currentNetworkId, int currentTransportStreamId, ushort programNumber, SpliceInsert spliceInsert) { if (spliceInsert.Components == null) return; if (spliceInsert.Components.Length == 0) return; MySqlCommand command = transaction.Connection.CreateCommand(); command.Transaction = transaction; command.CommandText = "INSERT INTO scte35_splice_components (cnid, ctsid, progno, splice_event_id, k, v) VALUES (@cnid, @ctsid, @progno, @splice_event_id, @k, @v)"; command.Parameters.AddWithValue("@cnid", currentNetworkId); command.Parameters.AddWithValue("@ctsid", currentTransportStreamId); command.Parameters.AddWithValue("@progno", programNumber); command.Parameters.AddWithValue("@splice_event_id", spliceInsert.SpliceEventId); command.Parameters.Add("@k", MySqlDbType.Int16); command.Parameters.Add("@v", MySqlDbType.Int64); foreach (Tuple component in spliceInsert.Components) { command.Parameters["@k"].Value = component.Item1; command.Parameters["@v"].Value = component.Item2; command.ExecuteNonQuery(); } } private void InsertScte35SpliceSegmentationComponents(MySqlTransaction transaction, int currentNetworkId, int currentTransportStreamId, ushort programNumber, SpliceInsert spliceInsert) { if (spliceInsert.Descriptors == null) return; if (spliceInsert.Descriptors.segmentationDescriptor == null) return; SegmentationDescriptor.Component[] components = spliceInsert.Descriptors.segmentationDescriptor.Components; if (components == null) return; if (components.Length == 0) return; MySqlCommand command = transaction.Connection.CreateCommand(); command.Transaction = transaction; command.CommandText = "INSERT INTO scte35_splice_segmentation_components (cnid, ctsid, progno, splice_event_id, component_tag, pts_offset) " + "VALUES (@cnid, @ctsid, @progno, @splice_event_id, @component_tag, @pts_offset)"; command.Parameters.AddWithValue("@cnid", currentNetworkId); command.Parameters.AddWithValue("@ctsid", currentTransportStreamId); command.Parameters.AddWithValue("@progno", programNumber); command.Parameters.AddWithValue("@splice_event_id", spliceInsert.SpliceEventId); command.Parameters.Add("@component_tag", MySqlDbType.Int16); command.Parameters.Add("@pts_offset", MySqlDbType.Int64); foreach (SegmentationDescriptor.Component component in components) { command.Parameters["@component_tag"].Value = component.ComponentTag; command.Parameters["@pts_offset"].Value = component.PtsOffset; command.ExecuteNonQuery(); } } private DateTime? QueryScte35TimeSignal(MySqlConnection connection, int currentNetworkId, int currentTransportStreamId, ushort programNumber) { MySqlCommand command = connection.CreateCommand(); command.CommandText = "SELECT dateadded FROM scte35_time_signal WHERE cnid = @cnid AND ctsid = @ctsid AND progno = @progno"; command.Parameters.AddWithValue("@cnid", currentNetworkId); command.Parameters.AddWithValue("@ctsid", currentTransportStreamId); command.Parameters.AddWithValue("@progno", programNumber); MySqlDataReader dataReader = command.ExecuteReader(); DateTime? result = null; if (dataReader.Read()) result = dataReader.GetDateTime(0); dataReader.Close(); return result; } public bool TestForScte35SpliceInsert(int currentNetworkId, int currentTransportStreamId, ushort programNumber, SpliceInsert spliceInsert) { using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString())) { connection.Open(); MySqlCommand command = connection.CreateCommand(); command.CommandText = "SELECT dateadded FROM scte35_splice WHERE cnid = @cnid AND ctsid = @ctsid AND progno = @progno AND splice_event_id = @splice_event_id"; command.Parameters.AddWithValue("@cnid", currentNetworkId); command.Parameters.AddWithValue("@ctsid", currentTransportStreamId); command.Parameters.AddWithValue("@progno", programNumber); command.Parameters.AddWithValue("@splice_event_id", spliceInsert.SpliceEventId); MySqlDataReader dataReader = command.ExecuteReader(); bool result = dataReader.Read(); dataReader.Close(); connection.Close(); return result; } } public void StoreScte35SpliceInsert(int currentNetworkId, int currentTransportStreamId, ushort programNumber, SpliceInsert spliceInsert) { using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString())) { connection.Open(); MySqlTransaction transaction = connection.BeginTransaction(); MySqlCommand command = connection.CreateCommand(); command.Transaction = transaction; command.CommandText = "INSERT INTO scte35_splice (cnid, ctsid, progno, splice_event_id, splice_time, splice_event_cancel_indicator, avails_expected, avail_num, unique_program_id, duration, duration_auto_return, splice_immediate_flag, duration_flag, program_splice_flag, out_of_network_indicator, provider_avail_id, identifier, sub_segments_expected, sub_segment_num, segments_expected, segment_num, segmentation_type_id, segmentation_upid, segmentation_upid_type, segmentation_duration, program_segmentation_flag, segmentation_event_cancel_indicator, device_restrictions, archive_allowed_flag, no_regional_blackout_flag, web_delivery_flag, segmentation_duration_flag, segmentation_event_id, segmentation_identifier, utc_offset, tai_ns, tai_seconds, tai_identififer) " + "VALUES (@cnid, @ctsid, @progno, @splice_event_id, @splice_time, @splice_event_cancel_indicator, @avails_expected, @avail_num, @unique_program_id, @duration, @duration_auto_return, @splice_immediate_flag, " + "@duration_flag, @program_splice_flag, @out_of_network_indicator, @provider_avail_id, @identifier, @sub_segments_expected, @sub_segment_num, @segments_expected, @segment_num," + "@segmentation_type_id, @segmentation_upid, @segmentation_upid_type, @segmentation_duration, @program_segmentation_flag, @segmentation_event_cancel_indicator, @device_restrictions, " + "@archive_allowed_flag, @no_regional_blackout_flag, @web_delivery_flag, @segmentation_duration_flag, @segmentation_event_id, @segmentation_identifier, @utc_offset, @tai_ns, @tai_seconds, @tai_identififer)"; command.Parameters.AddWithValue("@cnid", currentNetworkId); command.Parameters.AddWithValue("@ctsid", currentTransportStreamId); command.Parameters.AddWithValue("@progno", programNumber); command.Parameters.AddWithValue("@splice_event_id", spliceInsert.SpliceEventId); command.Parameters.AddWithValue("@splice_time", spliceInsert.SpliceTime); command.Parameters.AddWithValue("@splice_event_cancel_indicator", spliceInsert.SpliceEventCancelIndicator); command.Parameters.AddWithValue("@avails_expected", spliceInsert.AvailsExpected); command.Parameters.AddWithValue("@avail_num", spliceInsert.AvailNum); command.Parameters.AddWithValue("@unique_program_id", spliceInsert.UniqueProgramId); command.Parameters.AddWithValue("@duration", spliceInsert.Duration); command.Parameters.AddWithValue("@duration_auto_return", spliceInsert.DurationAutoReturn); command.Parameters.AddWithValue("@splice_immediate_flag", spliceInsert.SpliceImmediateFlag); command.Parameters.AddWithValue("@duration_flag", spliceInsert.DurationFlag); command.Parameters.AddWithValue("@program_splice_flag", spliceInsert.ProgramSpliceFlag); command.Parameters.AddWithValue("@out_of_network_indicator", spliceInsert.OutOfNetworkIndicator); if (spliceInsert.Descriptors != null) { if (spliceInsert.Descriptors.availDescriptor != null) { command.Parameters.AddWithValue("@provider_avail_id", spliceInsert.Descriptors.availDescriptor.ProviderAvailId); command.Parameters.AddWithValue("@identifier", spliceInsert.Descriptors.availDescriptor.Identifier); } else { command.Parameters.AddWithValue("@provider_avail_id", DBNull.Value); command.Parameters.AddWithValue("@identifier", DBNull.Value); } if (spliceInsert.Descriptors.segmentationDescriptor != null) { command.Parameters.AddWithValue("@sub_segments_expected", spliceInsert.Descriptors.segmentationDescriptor.SubSegmentsExpected); command.Parameters.AddWithValue("@sub_segment_num", spliceInsert.Descriptors.segmentationDescriptor.SubSegmentNum); command.Parameters.AddWithValue("@segments_expected", spliceInsert.Descriptors.segmentationDescriptor.SegmentsExpected); command.Parameters.AddWithValue("@segment_num", spliceInsert.Descriptors.segmentationDescriptor.SegmentNum); command.Parameters.AddWithValue("@segmentation_type_id", spliceInsert.Descriptors.segmentationDescriptor.SegmentationTypeId); command.Parameters.AddWithValue("@segmentation_upid", spliceInsert.Descriptors.segmentationDescriptor.SegmentationUpid); command.Parameters.AddWithValue("@segmentation_upid_type", spliceInsert.Descriptors.segmentationDescriptor.SegmentationUpidType); command.Parameters.AddWithValue("@segmentation_duration", spliceInsert.Descriptors.segmentationDescriptor.SegmentationDuration); command.Parameters.AddWithValue("@program_segmentation_flag", spliceInsert.Descriptors.segmentationDescriptor.ProgramSegmentationFlag); command.Parameters.AddWithValue("@segmentation_event_cancel_indicator", spliceInsert.Descriptors.segmentationDescriptor.SegmentationEventCancelIndicator); command.Parameters.AddWithValue("@device_restrictions", spliceInsert.Descriptors.segmentationDescriptor.DeviceRestrictions); command.Parameters.AddWithValue("@archive_allowed_flag", spliceInsert.Descriptors.segmentationDescriptor.ArchiveAllowedFlag); command.Parameters.AddWithValue("@no_regional_blackout_flag", spliceInsert.Descriptors.segmentationDescriptor.NoRegionalBlackoutFlag); command.Parameters.AddWithValue("@web_delivery_flag", spliceInsert.Descriptors.segmentationDescriptor.WebDeliveryFlag); command.Parameters.AddWithValue("@segmentation_duration_flag", spliceInsert.Descriptors.segmentationDescriptor.SegmentationDurationFlag); command.Parameters.AddWithValue("@segmentation_event_id", spliceInsert.Descriptors.segmentationDescriptor.SegmentationEventId); command.Parameters.AddWithValue("@segmentation_identifier", spliceInsert.Descriptors.segmentationDescriptor.Identifier); } else { command.Parameters.AddWithValue("@sub_segments_expected", DBNull.Value); command.Parameters.AddWithValue("@sub_segment_num", DBNull.Value); command.Parameters.AddWithValue("@segments_expected", DBNull.Value); command.Parameters.AddWithValue("@segment_num", DBNull.Value); command.Parameters.AddWithValue("@segmentation_type_id", DBNull.Value); command.Parameters.AddWithValue("@segmentation_upid", DBNull.Value); command.Parameters.AddWithValue("@segmentation_upid_type", DBNull.Value); command.Parameters.AddWithValue("@segmentation_duration", DBNull.Value); command.Parameters.AddWithValue("@program_segmentation_flag", DBNull.Value); command.Parameters.AddWithValue("@segmentation_event_cancel_indicator", DBNull.Value); command.Parameters.AddWithValue("@device_restrictions", DBNull.Value); command.Parameters.AddWithValue("@archive_allowed_flag", DBNull.Value); command.Parameters.AddWithValue("@no_regional_blackout_flag", DBNull.Value); command.Parameters.AddWithValue("@web_delivery_flag", DBNull.Value); command.Parameters.AddWithValue("@segmentation_duration_flag", DBNull.Value); command.Parameters.AddWithValue("@segmentation_event_id", DBNull.Value); command.Parameters.AddWithValue("@segmentation_identifier", DBNull.Value); } if (spliceInsert.Descriptors.timeDescriptor != null) { command.Parameters.AddWithValue("@segmentation_identifier", spliceInsert.Descriptors.timeDescriptor.UtcOffset); command.Parameters.AddWithValue("@tai_ns", spliceInsert.Descriptors.timeDescriptor.TaiNs); command.Parameters.AddWithValue("@tai_seconds", spliceInsert.Descriptors.timeDescriptor.TaiSeconds); command.Parameters.AddWithValue("@tai_identififer", spliceInsert.Descriptors.timeDescriptor.Identifier); } else { command.Parameters.AddWithValue("@utc_offset", DBNull.Value); command.Parameters.AddWithValue("@tai_ns", DBNull.Value); command.Parameters.AddWithValue("@tai_seconds", DBNull.Value); command.Parameters.AddWithValue("@tai_identififer", DBNull.Value); } } else { command.Parameters.AddWithValue("@provider_avail_id", DBNull.Value); command.Parameters.AddWithValue("@identifier", DBNull.Value); command.Parameters.AddWithValue("@sub_segments_expected", DBNull.Value); command.Parameters.AddWithValue("@sub_segment_num", DBNull.Value); command.Parameters.AddWithValue("@segments_expected", DBNull.Value); command.Parameters.AddWithValue("@segment_num", DBNull.Value); command.Parameters.AddWithValue("@segmentation_type_id", DBNull.Value); command.Parameters.AddWithValue("@segmentation_upid", DBNull.Value); command.Parameters.AddWithValue("@segmentation_upid_type", DBNull.Value); command.Parameters.AddWithValue("@segmentation_duration", DBNull.Value); command.Parameters.AddWithValue("@program_segmentation_flag", DBNull.Value); command.Parameters.AddWithValue("@segmentation_event_cancel_indicator", DBNull.Value); command.Parameters.AddWithValue("@device_restrictions", DBNull.Value); command.Parameters.AddWithValue("@archive_allowed_flag", DBNull.Value); command.Parameters.AddWithValue("@no_regional_blackout_flag", DBNull.Value); command.Parameters.AddWithValue("@web_delivery_flag", DBNull.Value); command.Parameters.AddWithValue("@segmentation_duration_flag", DBNull.Value); command.Parameters.AddWithValue("@segmentation_event_id", DBNull.Value); command.Parameters.AddWithValue("@segmentation_identifier", DBNull.Value); command.Parameters.AddWithValue("@utc_offset", DBNull.Value); command.Parameters.AddWithValue("@tai_ns", DBNull.Value); command.Parameters.AddWithValue("@tai_seconds", DBNull.Value); command.Parameters.AddWithValue("@tai_identififer", DBNull.Value); } command.ExecuteNonQuery(); InsertScte35SpliceComponents(transaction, currentNetworkId, currentTransportStreamId, programNumber, spliceInsert); InsertScte35SpliceSegmentationComponents(transaction, currentNetworkId, currentTransportStreamId, programNumber, spliceInsert); transaction.Commit(); connection.Close(); } } public void SetScte35TimeSignal(int currentNetworkId, int currentTransportStreamId, DateTime currentTime, ushort programNumber, TimeSignal spliceInsert) { using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString())) { connection.Open(); MySqlCommand command = connection.CreateCommand(); command.CommandText = "INSERT INTO scte35_time_signal (cnid, ctsid, progno, current, value, provider_avail_id, identifier, sub_segments_expected, sub_segment_num, segments_expected, segment_num, segmentation_type_id, segmentation_upid, segmentation_upid_type, segmentation_duration, program_segmentation_flag, segmentation_event_cancel_indicator, device_restrictions, archive_allowed_flag, no_regional_blackout_flag, web_delivery_flag, segmentation_duration_flag, segmentation_event_id, segmentation_identifier, utc_offset, tai_ns, tai_seconds, tai_identififer) " + "VALUES (@cnid, @ctsid, @progno, @current, @value, @provider_avail_id, @identifier, @sub_segments_expected, @sub_segment_num, @segments_expected, @segment_num, @segmentation_type_id, @segmentation_upid, @segmentation_upid_type, @segmentation_duration, @program_segmentation_flag, @segmentation_event_cancel_indicator, @device_restrictions, @archive_allowed_flag, @no_regional_blackout_flag, @web_delivery_flag, @segmentation_duration_flag, @segmentation_event_id, @segmentation_identifier, @utc_offset, @tai_ns, @tai_seconds, @tai_identififer)"; command.Parameters.AddWithValue("@cnid", currentNetworkId); command.Parameters.AddWithValue("@ctsid", currentTransportStreamId); command.Parameters.AddWithValue("@progno", programNumber); command.Parameters.AddWithValue("@current", currentTime); if (spliceInsert.Descriptors != null) { if (spliceInsert.Descriptors.availDescriptor != null) { command.Parameters.AddWithValue("@provider_avail_id", spliceInsert.Descriptors.availDescriptor.ProviderAvailId); command.Parameters.AddWithValue("@identifier", spliceInsert.Descriptors.availDescriptor.Identifier); } else { command.Parameters.AddWithValue("@provider_avail_id", DBNull.Value); command.Parameters.AddWithValue("@identifier", DBNull.Value); } if (spliceInsert.Descriptors.segmentationDescriptor != null) { command.Parameters.AddWithValue("@sub_segments_expected", spliceInsert.Descriptors.segmentationDescriptor.SubSegmentsExpected); command.Parameters.AddWithValue("@sub_segment_num", spliceInsert.Descriptors.segmentationDescriptor.SubSegmentNum); command.Parameters.AddWithValue("@segments_expected", spliceInsert.Descriptors.segmentationDescriptor.SegmentsExpected); command.Parameters.AddWithValue("@segment_num", spliceInsert.Descriptors.segmentationDescriptor.SegmentNum); command.Parameters.AddWithValue("@segmentation_type_id", spliceInsert.Descriptors.segmentationDescriptor.SegmentationTypeId); command.Parameters.AddWithValue("@segmentation_upid", spliceInsert.Descriptors.segmentationDescriptor.SegmentationUpid); command.Parameters.AddWithValue("@segmentation_upid_type", spliceInsert.Descriptors.segmentationDescriptor.SegmentationUpidType); command.Parameters.AddWithValue("@segmentation_duration", spliceInsert.Descriptors.segmentationDescriptor.SegmentationDuration); command.Parameters.AddWithValue("@program_segmentation_flag", spliceInsert.Descriptors.segmentationDescriptor.ProgramSegmentationFlag); command.Parameters.AddWithValue("@segmentation_event_cancel_indicator", spliceInsert.Descriptors.segmentationDescriptor.SegmentationEventCancelIndicator); command.Parameters.AddWithValue("@device_restrictions", spliceInsert.Descriptors.segmentationDescriptor.DeviceRestrictions); command.Parameters.AddWithValue("@archive_allowed_flag", spliceInsert.Descriptors.segmentationDescriptor.ArchiveAllowedFlag); command.Parameters.AddWithValue("@no_regional_blackout_flag", spliceInsert.Descriptors.segmentationDescriptor.NoRegionalBlackoutFlag); command.Parameters.AddWithValue("@web_delivery_flag", spliceInsert.Descriptors.segmentationDescriptor.WebDeliveryFlag); command.Parameters.AddWithValue("@segmentation_duration_flag", spliceInsert.Descriptors.segmentationDescriptor.SegmentationDurationFlag); command.Parameters.AddWithValue("@segmentation_event_id", spliceInsert.Descriptors.segmentationDescriptor.SegmentationEventId); command.Parameters.AddWithValue("@segmentation_identifier", spliceInsert.Descriptors.segmentationDescriptor.Identifier); } else { command.Parameters.AddWithValue("@sub_segments_expected", DBNull.Value); command.Parameters.AddWithValue("@sub_segment_num", DBNull.Value); command.Parameters.AddWithValue("@segments_expected", DBNull.Value); command.Parameters.AddWithValue("@segment_num", DBNull.Value); command.Parameters.AddWithValue("@segmentation_type_id", DBNull.Value); command.Parameters.AddWithValue("@segmentation_upid", DBNull.Value); command.Parameters.AddWithValue("@segmentation_upid_type", DBNull.Value); command.Parameters.AddWithValue("@segmentation_duration", DBNull.Value); command.Parameters.AddWithValue("@program_segmentation_flag", DBNull.Value); command.Parameters.AddWithValue("@segmentation_event_cancel_indicator", DBNull.Value); command.Parameters.AddWithValue("@device_restrictions", DBNull.Value); command.Parameters.AddWithValue("@archive_allowed_flag", DBNull.Value); command.Parameters.AddWithValue("@no_regional_blackout_flag", DBNull.Value); command.Parameters.AddWithValue("@web_delivery_flag", DBNull.Value); command.Parameters.AddWithValue("@segmentation_duration_flag", DBNull.Value); command.Parameters.AddWithValue("@segmentation_event_id", DBNull.Value); command.Parameters.AddWithValue("@segmentation_identifier", DBNull.Value); } if (spliceInsert.Descriptors.timeDescriptor != null) { command.Parameters.AddWithValue("@utc_offset", spliceInsert.Descriptors.timeDescriptor.UtcOffset); command.Parameters.AddWithValue("@tai_ns", spliceInsert.Descriptors.timeDescriptor.TaiNs); command.Parameters.AddWithValue("@tai_seconds", spliceInsert.Descriptors.timeDescriptor.TaiSeconds); command.Parameters.AddWithValue("@tai_identififer", spliceInsert.Descriptors.timeDescriptor.Identifier); } else { command.Parameters.AddWithValue("@utc_offset", DBNull.Value); command.Parameters.AddWithValue("@tai_ns", DBNull.Value); command.Parameters.AddWithValue("@tai_seconds", DBNull.Value); command.Parameters.AddWithValue("@tai_identififer", DBNull.Value); } } else { command.Parameters.AddWithValue("@provider_avail_id", DBNull.Value); command.Parameters.AddWithValue("@identifier", DBNull.Value); command.Parameters.AddWithValue("@sub_segments_expected", DBNull.Value); command.Parameters.AddWithValue("@sub_segment_num", DBNull.Value); command.Parameters.AddWithValue("@segments_expected", DBNull.Value); command.Parameters.AddWithValue("@segment_num", DBNull.Value); command.Parameters.AddWithValue("@segmentation_type_id", DBNull.Value); command.Parameters.AddWithValue("@segmentation_upid", DBNull.Value); command.Parameters.AddWithValue("@segmentation_upid_type", DBNull.Value); command.Parameters.AddWithValue("@segmentation_duration", DBNull.Value); command.Parameters.AddWithValue("@program_segmentation_flag", DBNull.Value); command.Parameters.AddWithValue("@segmentation_event_cancel_indicator", DBNull.Value); command.Parameters.AddWithValue("@device_restrictions", DBNull.Value); command.Parameters.AddWithValue("@archive_allowed_flag", DBNull.Value); command.Parameters.AddWithValue("@no_regional_blackout_flag", DBNull.Value); command.Parameters.AddWithValue("@web_delivery_flag", DBNull.Value); command.Parameters.AddWithValue("@segmentation_duration_flag", DBNull.Value); command.Parameters.AddWithValue("@segmentation_event_id", DBNull.Value); command.Parameters.AddWithValue("@segmentation_identifier", DBNull.Value); command.Parameters.AddWithValue("@utc_offset", DBNull.Value); command.Parameters.AddWithValue("@tai_ns", DBNull.Value); command.Parameters.AddWithValue("@tai_seconds", DBNull.Value); command.Parameters.AddWithValue("@tai_identififer", DBNull.Value); } command.ExecuteNonQueryAsync().ContinueWith( x => { connection.Close(); } ); } } } }