-
Notifications
You must be signed in to change notification settings - Fork 0
/
etv-media-scraper.rb
executable file
·84 lines (67 loc) · 2.29 KB
/
etv-media-scraper.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env ruby
require 'fileutils'
require 'json'
require 'net/https'
require 'time'
require_relative File.join('lib', 'etv_media_scraper_constants')
require_relative File.join('lib', 'etv_media_scraper_entity')
require_relative File.join('lib', 'etv_media_scraper_entity_resource')
require_relative File.join('lib', 'etv_media_scraper_global')
require_relative File.join('lib', 'etv_media_scraper_helper')
# Bootstrap class that connects everything together.
class EtvMediaScraper
prepend EtvMediaScraperGlobal
def initialize
$config.create_entities
@entities = $config.entities
end
def selector_param
$config.mode == 2 ? 'parentContentId=' : 'category='
end
def selector_key
$config.mode == 2 ? 'parent_content_id' : 'category'
end
def process_entity
@episodes = []
fetch_resource
@episodes.each(&:download)
end
def resource_url
url = @entity.etv2 ? EtvMediaScraperConstants::ETV2_API_URL.dup : EtvMediaScraperConstants::ETV_API_URL.dup
url << selector_param
url << @entity.instance_variable_get("@#{selector_key}").to_s
url << EtvMediaScraperConstants::API_PARAMS_TS_STRING << Time.new.to_i.to_s
url << EtvMediaScraperConstants::API_PARAMS_STRING
url
end
def parse_resource
@resource.each do |object|
entity_resource = EtvMediaScraperEntityResource.new(object)
@entity.name = entity_resource.name unless @entity.name
episode_options = entity_resource.episode_options(@entity)
next unless episode_options['url']
season = @entity.create_season(number: entity_resource.season_number)
episode = season.create_episode(episode_options)
next if @entity.ignore_special_episodes && (episode.number.to_i.zero? || season.number.to_i.zero?)
@episodes.push(episode)
end
end
def fetch_resource
options = EtvMediaScraperHelper.http_options(resource_url)
Net::HTTP.start(options[:uri].host, options[:uri].port, options[:options]) do |http|
request = Net::HTTP::Get.new(options[:uri].request_uri)
response = http.request(request)
json = JSON.parse(response.body)
@resource = json['data']
parse_resource
end
end
def run
@entities.each do |entity|
@entity = entity
process_entity
end
end
end
scraper = EtvMediaScraper.new
scraper.run