etvnet_seek 0.3.0 → 0.4.0

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.
data/CHANGES CHANGED
@@ -11,4 +11,8 @@
11
11
 
12
12
  == Version 0.3.0
13
13
 
14
- * Bug fixes, support for Runglish (you can enter russian string as latin one)
14
+ * Bug fixes, support for Runglish (you can enter russian string as latin one)
15
+
16
+ == Version 0.4.0
17
+
18
+ * Bug fixes, adding support for main menu
data/Rakefile CHANGED
@@ -5,6 +5,44 @@ rescue LoadError
5
5
  exit
6
6
  end
7
7
 
8
+
9
+ begin
10
+ require 'metric_fu'
11
+
12
+ MetricFu::Configuration.run do |config|
13
+ #define which metrics you want to use
14
+ config.metrics = [:churn, :saikuro, :flog, :flay, :reek, :roodi, :rcov]
15
+ config.graphs = [:flog, :flay, :reek, :roodi, :rcov]
16
+ config.flay = { :dirs_to_flay => ['app', 'lib'],
17
+ :minimum_score => 100 }
18
+ config.flog = { :dirs_to_flog => ['app', 'lib'] }
19
+ config.reek = { :dirs_to_reek => ['app', 'lib'] }
20
+ config.roodi = { :dirs_to_roodi => ['app', 'lib'] }
21
+ config.saikuro = { :output_directory => 'scratch_directory/saikuro',
22
+ :input_directory => ['app', 'lib'],
23
+ :cyclo => "",
24
+ :filter_cyclo => "0",
25
+ :warn_cyclo => "5",
26
+ :error_cyclo => "7",
27
+ :formater => "text"} #this needs to be set to "text"
28
+ config.churn = { :start_date => "1 year ago", :minimum_churn_count => 10}
29
+ config.rcov = { :environment => 'test',
30
+ :test_files => ['test/**/*_test.rb',
31
+ 'spec/**/*_spec.rb'],
32
+ :rcov_opts => ["--sort coverage",
33
+ "--no-html",
34
+ "--text-coverage",
35
+ "--no-color",
36
+ "--profile",
37
+ "--rails",
38
+ "--exclude /gems/,/Library/,spec"]}
39
+ config.graph_engine = :bluff
40
+ end
41
+ rescue LoadError
42
+ puts "MetricFu is not available. Install it with: sudo gem install metric_fu"
43
+ exit
44
+ end
45
+
8
46
  task :zip do
9
47
  zip :archive => "etvnet_seek.zip", :dir => "."
10
48
  end
@@ -15,4 +53,11 @@ task :"run:gem" do
15
53
  puts ruby("#{command}")
16
54
  end
17
55
 
56
+ # configure rspec
57
+ #Spec::Rake::SpecTask.new do |spec|
58
+ # spec.spec_files = FileList["spec/**/*_spec.rb"]
59
+ # spec.spec_opts << "--color"
60
+ # spec.libs += ["lib", "spec"]
61
+ #end
62
+
18
63
  task :default => :zip
data/bin/etvnet_seek CHANGED
@@ -7,26 +7,19 @@ $:.unshift(File::join(File::dirname(File::dirname(__FILE__)), "lib"))
7
7
 
8
8
  $KCODE='u'
9
9
 
10
- require 'main'
10
+ require 'etvnet_seek/main'
11
11
 
12
- client = Main.new
12
+ trap('INT') { puts "Program was interrupted..."; exit }
13
13
 
14
- keywords = ARGV.join(' ')
14
+ client = Main.new
15
15
 
16
- if RUBY_PLATFORM =~ /mswin32/
17
- keywords = Runglish.new.lat_to_ru(keywords)
18
- end
16
+ link_info = client.seek ARGV.join(' ')
19
17
 
20
- movie_link = client.search_and_grab_link keywords
18
+ if not link_info.nil? and link_info.resolved?
19
+ puts "Link #{link_info.text} [#{link_info.name} (#{link_info.media_file})]: #{link_info.link}"
21
20
 
22
- if movie_link
23
- puts "Link: #{movie_link}"
24
-
25
- if RUBY_PLATFORM =~ /(win|w)32$/
26
- `start wmplayer #{movie_link}`
27
- elsif RUBY_PLATFORM =~ /darwin/
28
- `open #{movie_link}`
29
- end
21
+ launch = ask("Launch link (y/n)?")
30
22
 
23
+ client.launch_link link_info.link unless launch =~ /n/i
31
24
  end
32
25
 
data/etvnet_seek.gemspec CHANGED
@@ -4,7 +4,7 @@ require "rake"
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = %q{etvnet_seek}
7
- s.version = "0.3.0"
7
+ s.version = "0.4.0"
8
8
 
9
9
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
10
10
 
@@ -34,8 +34,13 @@ Gem::Specification.new do |s|
34
34
 
35
35
  s.add_dependency("json_pure", ">= 1.2.0")
36
36
  s.add_dependency("highline", ">= 1.5.1")
37
- s.add_dependency("nokogiri", ">= 1.3.3")
38
-
39
- s.add_development_dependency "rspec", ">= 1.2.8"
40
- s.add_development_dependency "mocha", ">= 0.9.7"
37
+ s.add_dependency("libxml-ruby", ">= 1.1.3")
38
+ s.add_dependency("nokogiri", ">= 1.4.1")
39
+
40
+ s.add_development_dependency "rspec", ">= 1.2.9"
41
+ s.add_development_dependency "mocha", ">= 0.9.7"
42
+ s.add_development_dependency "metric_fu"
43
+ s.add_development_dependency "reek"
44
+ s.add_development_dependency "roodi"
45
+ s.add_development_dependency "googlecharts"
41
46
  end
@@ -0,0 +1,93 @@
1
+ class Commander
2
+ attr_accessor :mode
3
+
4
+ def initialize
5
+ @options = parse_options
6
+ end
7
+
8
+ def search_mode?
9
+ @options[:runglish]
10
+ end
11
+
12
+ def runglish_mode?
13
+ @options[:runglish]
14
+ end
15
+
16
+ def get_initial_mode
17
+ if @options[:search] == true
18
+ 'search'
19
+ elsif @options[:best_ten] == true
20
+ 'best_ten'
21
+ elsif @options[:popular] == true
22
+ 'popular'
23
+ elsif @options[:we_recommend] == true
24
+ 'we_recommend'
25
+ elsif @options[:channels] == true
26
+ 'channels'
27
+ else
28
+ 'main'
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def parse_options
35
+ # This hash will hold all of the options
36
+ # parsed from the command-line by
37
+ # OptionParser.
38
+ options = {}
39
+
40
+ optparse = OptionParser.new do|opts|
41
+ # Set a banner, displayed at the top
42
+ # of the help screen.
43
+ opts.banner = "Usage: etvnet_seek [options] keywords"
44
+
45
+ options[:search] = false
46
+ opts.on( '-s', '--search', 'Display Search Menu' ) do
47
+ options[:search] = true
48
+ end
49
+
50
+ options[:runglish] = false
51
+ opts.on( '-r', '--runglish', 'Enter russian keywords in translit' ) do
52
+ options[:runglish] = true
53
+ end
54
+
55
+ options[:best_ten] = false
56
+ opts.on( '-b', '--best-ten', 'Display Best 10 Menu' ) do
57
+ options[:best_ten] = true
58
+ end
59
+
60
+ options[:popular] = false
61
+ opts.on( '-p', '--popular', 'Display Popular Menu' ) do
62
+ options[:popular] = true
63
+ end
64
+
65
+ options[:we_recommend] = false
66
+ opts.on( '-w', '--we-recommend', 'Display We recommend Menu' ) do
67
+ options[:we_recommend] = true
68
+ end
69
+
70
+ options[:channels] = false
71
+ opts.on( '-c', '--channels', 'Display Channels Menu' ) do
72
+ options[:channels] = true
73
+ end
74
+
75
+ options[:main] = false
76
+ opts.on( '-m', '--main', 'Display Main Menu' ) do
77
+ options[:main] = true
78
+ end
79
+
80
+ # This displays the help screen, all programs are
81
+ # assumed to have this option.
82
+ opts.on( '-h', '--help', 'Display this screen' ) do
83
+ puts opts
84
+ exit
85
+ end
86
+ end
87
+
88
+ optparse.parse!
89
+
90
+ options
91
+ end
92
+
93
+ end
@@ -1,43 +1,25 @@
1
1
  require 'net/http'
2
2
  require 'uri'
3
3
 
4
- module CookieHelper
5
- def retrieve_cookie url, username, password
6
- uri = URI.parse(url)
7
- conn = Net::HTTP.new(uri.host, uri.port)
8
-
9
- headers = { "Content-Type" => "application/x-www-form-urlencoded" }
10
- resp, data = conn.post(uri.path,
11
- "action=login&username=#{username}&pwd=#{password}&skip_notice=&redirect=", headers)
12
-
13
- cookie = resp.response['set-cookie']
4
+ class CookieHelper
5
+
6
+ def initialize cookie_file_name
7
+ @cookie_file_name = cookie_file_name
8
+ end
14
9
 
15
- cleanup_cookie(cookie)
10
+ def load_cookie
11
+ File.exist?(@cookie_file_name) ? read_cookie : nil
16
12
  end
17
13
 
18
- private
19
-
20
- def cleanup_cookie cookie
21
- auth, expires = get_auth_and_expires(cookie)
22
- username = get_username(cookie)
23
- path = "/"
24
- domain = ".etvnet.ca"
25
-
26
- cookies_text = <<-TEXT
27
- auth=#{auth}; expires=#{expires}; path=#{path}; domain=#{domain}
28
- username=#{username}; expires=#{expires}; path=#{path}; domain=#{domain}
29
- TEXT
30
-
31
- new_cookie = ""
32
- require 'stringio'
33
- StringIO.new(cookies_text).each_line do |line|
34
- new_cookie = new_cookie + line.strip + "; "
35
- end
14
+ def save_cookie cookie
15
+ File.open(@cookie_file_name, 'w') { |file| file.puts cookie }
16
+ end
36
17
 
37
- new_cookie
18
+ def delete_cookie
19
+ File.delete @cookie_file_name if File.exist? @cookie_file_name
38
20
  end
39
21
 
40
- def get_auth_and_expires cookie
22
+ def self.get_auth_and_expires cookie
41
23
  length = "auth=".length
42
24
 
43
25
  auth = ""
@@ -66,7 +48,7 @@ module CookieHelper
66
48
  [auth, expires]
67
49
  end
68
50
 
69
- def get_username cookie
51
+ def self.get_username cookie
70
52
  length = "username=".length
71
53
 
72
54
  username = ""
@@ -90,4 +72,11 @@ module CookieHelper
90
72
 
91
73
  username
92
74
  end
75
+
76
+ private
77
+
78
+ def read_cookie
79
+ File.open(@cookie_file_name, 'r') { |file| file.gets }
80
+ end
81
+
93
82
  end
@@ -0,0 +1,18 @@
1
+ class AccessPage < ServiceCall
2
+ ACCESS_URL = Page::BASE_URL + "/cgi-bin/video/access.fcgi"
3
+
4
+ def initialize
5
+ super(ACCESS_URL)
6
+ end
7
+
8
+ def request_media_info media_file, cookie
9
+ params = { 'action' => 'start_video', 'bitrate' => '600',
10
+ 'media_file'=> media_file, 'replay' => '1', 'skin' => 'JSON' }
11
+ headers = { 'Cookie' => cookie }
12
+
13
+ response = post(params, headers)
14
+
15
+ MediaInfo.new JSON.parse(response.body)["PARAMETERS"]
16
+ end
17
+
18
+ end
@@ -0,0 +1,34 @@
1
+ class AnnouncesPage < MediaPage
2
+ ANNOUNCES_URL = BASE_URL + "/announces.html"
3
+
4
+ def initialize()
5
+ super(ANNOUNCES_URL)
6
+ end
7
+
8
+ def category_breadcrumbs
9
+ []
10
+ end
11
+
12
+ def items
13
+ list = []
14
+
15
+ document.css("table tr td div").each do |item|
16
+ unless item.css("a").at(0).nil?
17
+ image = item.css("img").at(0).attributes['src'].value.strip
18
+
19
+ unless image == 'images/banner_announces.jpg'
20
+ text = item.css("img").at(0).attributes['alt'].value.strip
21
+ href = item.css("a").at(0).attributes['href'].value
22
+ image = item.css("img").at(0).attributes['src'].value.strip
23
+
24
+ record = BrowseMediaItem.new(text, href)
25
+ record.image = image
26
+
27
+ list << record
28
+ end
29
+ end
30
+ end
31
+
32
+ list
33
+ end
34
+ end
@@ -0,0 +1,129 @@
1
+ class BasePage < Page
2
+ def items
3
+ list = []
4
+
5
+ document.css("#tblCategories a").each do |item|
6
+ text = item.css("img").at(0).attributes['alt'].value
7
+ href = item['href']
8
+
9
+ list << MediaItem.new(text, href)
10
+ end
11
+
12
+ list
13
+ end
14
+
15
+ def title
16
+ document.css("title").text
17
+ end
18
+
19
+ def page_title
20
+ document.css(".global_content .global_content h1").text
21
+ end
22
+
23
+ def navigation_menu
24
+ list = []
25
+
26
+ document.css("table tr td .navigation").first.parent.parent.parent.css("tr td a").each do |item|
27
+ text = item.children.at(0).content
28
+ href = item['href']
29
+
30
+ list << MediaItem.new(text, href) unless href =~ /(login|signup)/
31
+ end
32
+
33
+ list
34
+ end
35
+
36
+ def category_breadcrumbs
37
+ list = []
38
+
39
+ document.css("table tr td table tr td table tr td strong").each_with_index do |item, index|
40
+ if index == 0
41
+ item.children.each do |child|
42
+ text = child.text
43
+ link = child.attributes['href']
44
+ href = link.nil? ? nil : link.value
45
+
46
+ list << MediaItem.new(text, href)
47
+ end
48
+ end
49
+ end
50
+
51
+ list
52
+ end
53
+
54
+ def categories
55
+ list = []
56
+
57
+ document.css("table").each_with_index do |table1, index1|
58
+ if index1 == 5
59
+ table1.css("tr/td/table/tr/td/table").each_with_index do |table2, index2|
60
+ if index2 == 2
61
+ table2.css("tr[2]/td[2]/table").each_with_index do |table3, index3|
62
+
63
+ #if index2 > 1
64
+ table2.css("tr td a").each_with_index do |item2, index4|
65
+ link = item2.attributes['href'].value
66
+
67
+ if index4 > 0
68
+ text = item2.text
69
+ href = link
70
+
71
+ additional_info = additional_info(item2, 2)
72
+
73
+ list << MediaItem.new(text, href, additional_info)
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ list
83
+ end
84
+
85
+ def title_items
86
+ list = []
87
+
88
+ root = nil
89
+ document.css("a").each do |item|
90
+ link = item.attributes['href']
91
+
92
+ unless link.value =~ /login.fcgi/
93
+ if link.value =~ /order_by/
94
+ root = link.parent.parent.parent.parent.parent.parent
95
+ break
96
+ end
97
+ end
98
+ end
99
+
100
+ if root
101
+ root.css("td").each do |item|
102
+ if item.search("table/tr/td/a").size > 0
103
+ link = item.css("table tr td a").first
104
+
105
+ text = link.text
106
+ href = link.attributes['href'].value
107
+
108
+ list << MediaItem.new(text, href)
109
+ elsif item.children.size == 1
110
+ if list.all? { |e| e.text != item.text }
111
+ list << MediaItem.new(item.text, nil)
112
+ end
113
+ end
114
+ end
115
+ end
116
+
117
+ list
118
+ end
119
+
120
+ protected
121
+
122
+ def additional_info node, index
123
+ children = node.parent.children
124
+ if children.size > 0
125
+ element = children.at(index)
126
+ element.text if element
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,40 @@
1
+ class BrowseMediaItem < MediaItem
2
+ attr_accessor :folder, :showtime, :year, :duration, :rating_image, :image
3
+
4
+ def initialize(text, link)
5
+ super(text, link)
6
+ end
7
+
8
+ def folder?
9
+ folder == true
10
+ end
11
+
12
+ def to_s
13
+ if folder?
14
+ buffer = "*** Folder *** "
15
+ else
16
+ buffer = ""
17
+ end
18
+
19
+ buffer += text
20
+
21
+ unless folder?
22
+ if underscore_name
23
+ buffer += ": #{underscore_name}"
24
+ else
25
+ buffer += ": #{link}"
26
+ end
27
+ end
28
+
29
+ buffer += " --- #{showtime}" if showtime
30
+
31
+ buffer += " (#{media_file})" if not media_file.nil? and media_file.size > 0
32
+ buffer += " --- #{year}" if not year.nil? and year.size > 2
33
+ buffer += " --- #{duration}" if not duration.nil? and duration.size > 0
34
+ buffer += " --- #{image}" if image
35
+ buffer += " --- #{rating_image}" if rating_image
36
+
37
+ buffer
38
+ end
39
+
40
+ end
@@ -0,0 +1,13 @@
1
+ class ChannelMediaItem < MediaItem
2
+ attr_reader :archive_link
3
+
4
+ def initialize(text, link, archive_link)
5
+ super(text, link)
6
+
7
+ @archive_link = archive_link
8
+ end
9
+
10
+ def channel
11
+ link[link.index("channel=") + "channel=".size, link.size-1]
12
+ end
13
+ end
@@ -0,0 +1,37 @@
1
+ class ChannelsPage < MediaPage
2
+ BROWSE_URL = BASE_URL + "/cgi-bin/video/eitv_browse.fcgi"
3
+ CHANNELS_URL = BROWSE_URL + "?action=channels"
4
+
5
+ def initialize url = CHANNELS_URL
6
+ super(url)
7
+ end
8
+
9
+ def items
10
+ list = []
11
+
12
+ document.css("table table table.rounded_white table tr").each_with_index do |item, index|
13
+ links = item.css("table tr td a")
14
+
15
+ text = item.children.at(0).text.strip
16
+
17
+ if text.size > 0
18
+ link = nil
19
+ archive_link = nil
20
+
21
+ if links.size > 0
22
+ href = links[0]
23
+ archive_href = links[1]
24
+
25
+ link = href.attributes['href'].value unless href.nil?
26
+
27
+ archive_link = archive_href.attributes['href'].value unless archive_href.nil?
28
+ end
29
+
30
+ list << ChannelMediaItem.new(text, link, archive_link)
31
+ end
32
+ end
33
+
34
+ list
35
+ end
36
+
37
+ end
@@ -0,0 +1,38 @@
1
+ class FreetvPage < MediaPage
2
+ FREETV_URL = BASE_URL + "/freeTV.html"
3
+
4
+ def initialize
5
+ super(FREETV_URL)
6
+ end
7
+
8
+ def category_breadcrumbs
9
+ []
10
+ end
11
+
12
+ def items
13
+ list = []
14
+
15
+ document.css("table tr").each do |item|
16
+ node = item.css("td img")
17
+ if node.size > 0
18
+ text = node.at(0).parent.css("a")
19
+ unless text.to_s.size == 0
20
+ link = node.at(0).parent.css("a")
21
+ text = link.at(0).text.gsub(/\s\s+/, ' ')
22
+ rating_image = node.at(0).attributes['src']
23
+ image = link.at(0).parent.parent.previous.css("td img").at(0).attributes['src'].value.strip
24
+
25
+ href = link.at(0).attributes['href'].value.strip
26
+
27
+ record = BrowseMediaItem.new(text, href)
28
+ record.rating_image = rating_image
29
+ record.image = image
30
+
31
+ list << record
32
+ end
33
+ end
34
+ end
35
+
36
+ list
37
+ end
38
+ end
@@ -0,0 +1,14 @@
1
+ class GroupMediaItem < MediaItem
2
+ attr_reader :channel
3
+
4
+ def initialize(text, link, channel)
5
+ super(text, link)
6
+
7
+ @channel = channel
8
+ end
9
+
10
+ def to_s
11
+ "#{text} --- #{channel} --- #{link}"
12
+ end
13
+
14
+ end
@@ -0,0 +1,45 @@
1
+ class GroupPage < BasePage
2
+ protected
3
+
4
+ def get_typical_items tag_name
5
+ list = []
6
+
7
+ document.css(tag_name).at(0).next.children.each do |table|
8
+ href = table.css("a").at(0)
9
+
10
+ unless href.nil?
11
+ link = href.attributes['href'].value
12
+ text = href.children.at(0).content
13
+ channel = ""
14
+
15
+ if link =~ /media/
16
+ additional_info = additional_info(href, 1)
17
+
18
+ channel = additional_info.gsub(/\(|\)/, '') unless additional_info.nil?
19
+ end
20
+
21
+ list << GroupMediaItem.new(text, link, channel)
22
+ end
23
+ end
24
+
25
+ list
26
+ end
27
+ end
28
+
29
+ class BestTenPage < GroupPage
30
+ def items
31
+ get_typical_items("#tbl10best")
32
+ end
33
+ end
34
+
35
+ class PopularPage < GroupPage
36
+ def items
37
+ get_typical_items("#tblyearago")
38
+ end
39
+ end
40
+
41
+ class WeRecommendPage < GroupPage
42
+ def items
43
+ get_typical_items("#tblfree")
44
+ end
45
+ end