program-tv 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/program-tv +34 -0
- data/lib/program-tv/parser.rb +50 -0
- data/lib/program-tv/writer.rb +27 -0
- data/lib/program-tv.rb +32 -0
- metadata +90 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b04fd2f0e35187a93d403237b7db79558f533d5c
|
4
|
+
data.tar.gz: c8ebeea1e00f84b9dff8cb1acea9ecfc66464a6e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 17b5e1b757f8d418fa5be2bcd5e46b85a7549e2e959e95cc39f7e064b4a253b071dff20b6ea5ba5c4d713910c82a6fa36795b55f357b805117e3c87523d58207
|
7
|
+
data.tar.gz: 478fb98b0adbe12eddcd5903a420d3e69af9fe0cf140c2890ce6c193669f7fdc8a19d82650a78a141801303d5ccc9873100115f3df9382d3cfc65a77a484f71c
|
data/bin/program-tv
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$LOAD_PATH.push File.expand_path("../lib", File.dirname(__FILE__)) # add library to load path
|
4
|
+
|
5
|
+
require 'program-tv'
|
6
|
+
require 'optparse'
|
7
|
+
|
8
|
+
options = { layout: 'vertical', selector: 'img.sprite' }
|
9
|
+
op = OptionParser.new
|
10
|
+
op.banner = <<-eos
|
11
|
+
#{ProgramTV::DESCRIPTION}
|
12
|
+
|
13
|
+
Usage: program-tv [options]
|
14
|
+
|
15
|
+
eos
|
16
|
+
|
17
|
+
op.on("-h", "--help") do
|
18
|
+
puts op.to_s
|
19
|
+
exit!
|
20
|
+
end
|
21
|
+
|
22
|
+
op.on("-v", "--version") do
|
23
|
+
puts ProgramTV::VERSION
|
24
|
+
exit!
|
25
|
+
end
|
26
|
+
|
27
|
+
begin
|
28
|
+
op.parse!(ARGV)
|
29
|
+
ARGV.clear
|
30
|
+
ProgramTV.run!
|
31
|
+
rescue Exception => ex
|
32
|
+
puts ex.message
|
33
|
+
exit!
|
34
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module ProgramTV
|
2
|
+
class Parser
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@agent = Mechanize.new
|
6
|
+
@channel_list_url = "http://www.cyfrowypolsat.pl/program-tv/lista-kanalow/"
|
7
|
+
end
|
8
|
+
|
9
|
+
# Runs dynamic-sprites command.
|
10
|
+
#
|
11
|
+
def run
|
12
|
+
channel_urls.map do |url|
|
13
|
+
schedule(url)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def schedule(url)
|
20
|
+
page = Nokogiri::HTML(@agent.get(url).body)
|
21
|
+
data = page.css(".main.col > table:last > tbody > tr").map do |e|
|
22
|
+
{
|
23
|
+
start: running_time(e),
|
24
|
+
channel: url.match(/([^\/]+)\/;/)[1].to_s,
|
25
|
+
title: e.css('.name').text
|
26
|
+
}
|
27
|
+
end
|
28
|
+
data[0..-2].each_with_index{ |element, i| element[:end] = data[i+1][:start] }
|
29
|
+
data.last[:end] = data.first[:start]
|
30
|
+
data
|
31
|
+
end
|
32
|
+
|
33
|
+
# Fetches page with channel list and returns Array of urls to subpages with channel schedule
|
34
|
+
def channel_urls
|
35
|
+
page = Nokogiri::HTML(@agent.get(@channel_list_url).body)
|
36
|
+
page.css('.rowChannel a').select{ |c| ProgramTV.selected_channels.include?(c.text.to_s.strip) }.map{ |c| c.attr('href') }
|
37
|
+
end
|
38
|
+
|
39
|
+
# Methods to retrieve channel attributes
|
40
|
+
def running_time(element)
|
41
|
+
time = element.css('.time').text.match(/([0-9]+):([0-9]+)/)
|
42
|
+
return nil unless time
|
43
|
+
Time.new(Time.new.year,
|
44
|
+
Time.new.month,
|
45
|
+
Time.new.day,
|
46
|
+
time[1],
|
47
|
+
time[2])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'builder'
|
2
|
+
|
3
|
+
module ProgramTV
|
4
|
+
class Writer
|
5
|
+
|
6
|
+
def initialize(data)
|
7
|
+
@data = data
|
8
|
+
@xml = Builder::XmlMarkup.new( :indent => 2 )
|
9
|
+
@xml.instruct! :xml, :encoding => "UTF-8"
|
10
|
+
end
|
11
|
+
|
12
|
+
# Runs dynamic-sprites command.
|
13
|
+
#
|
14
|
+
def run
|
15
|
+
@xml.tv do |tv|
|
16
|
+
@data.flatten.each do |element|
|
17
|
+
tv.programme do |p|
|
18
|
+
p.title element[:title]
|
19
|
+
p.channel element[:channel]
|
20
|
+
p.start element[:start]
|
21
|
+
p.end element[:end]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/program-tv.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
module ProgramTV
|
2
|
+
|
3
|
+
#----------------------------------------------------------------------------
|
4
|
+
|
5
|
+
VERSION = "0.0.1"
|
6
|
+
SUMMARY = "TV Channel parser"
|
7
|
+
DESCRIPTION = "Downloads TV channel list in XML format"
|
8
|
+
|
9
|
+
require 'yaml'
|
10
|
+
require 'mechanize'
|
11
|
+
require 'nokogiri'
|
12
|
+
|
13
|
+
require_relative 'program-tv/parser' # Parsing from website
|
14
|
+
require_relative 'program-tv/writer' # Writing from ruby hash to XML
|
15
|
+
|
16
|
+
# Initilizes Runner which controls all the magic stuff.
|
17
|
+
#
|
18
|
+
def self.run!(options = {})
|
19
|
+
data = Parser.new.run
|
20
|
+
puts Writer.new(data).run
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def self.gem_root
|
26
|
+
File.expand_path '../..', __FILE__
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.selected_channels
|
30
|
+
@channels ||= YAML::load(File.open(File.join(gem_root, 'channels.yml')))
|
31
|
+
end
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: program-tv
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Maciej Walusiak
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-09-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: builder
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mechanize
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: nokogiri
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Downloads TV channel schedule in XML format
|
56
|
+
email: rabsztok@gmail.com
|
57
|
+
executables:
|
58
|
+
- program-tv
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- bin/program-tv
|
63
|
+
- lib/program-tv.rb
|
64
|
+
- lib/program-tv/parser.rb
|
65
|
+
- lib/program-tv/writer.rb
|
66
|
+
homepage: https://github.com/Rabsztok/program-tv
|
67
|
+
licenses:
|
68
|
+
- GPL
|
69
|
+
metadata: {}
|
70
|
+
post_install_message:
|
71
|
+
rdoc_options: []
|
72
|
+
require_paths:
|
73
|
+
- lib
|
74
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
requirements: []
|
85
|
+
rubyforge_project:
|
86
|
+
rubygems_version: 2.1.4
|
87
|
+
signing_key:
|
88
|
+
specification_version: 4
|
89
|
+
summary: TV Channel parser
|
90
|
+
test_files: []
|