module M2TSParser::Application::EpgParse
Public Instance Methods
eit_to_epgs(eit)
click to toggle source
# File lib/m2ts_parser/application/epg_parse.rb, line 24 def eit_to_epgs(eit) service_id = eit.service_id.to_i eit.events.map{|e| event_to_epg(service_id, e)} end
event_to_epg(service_id, event)
click to toggle source
# File lib/m2ts_parser/application/epg_parse.rb, line 29 def event_to_epg(service_id, event) { id: [service_id, event.event_id.to_i], service_id: service_id, event_id: event.event_id.to_i, start_time: event.start_time.to_s, duration: event.duration.to_sec, duration_pretty: event.duration.to_s, event_name: event.descriptors .select{|d| d.is_a? ShortEventDescriptor} .map{|d| d.event_name ? d.event_name.content_description : ""}, text: event.descriptors .select{|d| d.is_a? ShortEventDescriptor} .map{|d| d.text ? d.text.content_description : ""}, extended_text: event.descriptors .select{|d| d.is_a? ExtendedEventDescriptor} .map{|d| d.items.map{|i| { description: i.item_description_char ? i.item_description_char.content_description : "", text: i.item_char ? i.item_char.content_description : "" }}}, content_nibble: event.descriptors .select{|d| d.is_a? ContentDescriptor} .map{|d| d.contents.map{|c| { :level1 => {id: c.content_nibble_level_1.to_i, name: c.genre1}, :level2 => {id: c.content_nibble_level_2.to_i, name: c.genre2}, }}} } end
parse(path)
click to toggle source
# File lib/m2ts_parser/application/epg_parse.rb, line 7 def parse(path) parsed = [] File.open(path, 'rb') do |f| stream = MPEGTransportStream.new(f).filter{|packet| packet.pid == 0x12} while stream.rest? packets = stream.get_sequence{|packet| packet.payload_unit_start_indicator == 1 } if packets.each_cons(2).all?{|a, b| (a.continuity_counter + 1) % 16 == b.continuity_counter } data = packets.map{|p| p.data_bytes.to_s}.inject(&:+) if data && data.length > 0 parsed.concat eit_to_epgs(TableSelector.new(data).section) end end end end return parsed end