tvtid 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a4fed7edb8d062f0e970ea68728474290b4c4f0c
4
+ data.tar.gz: c54fd7e6cceb49c6c659a8362adc1d88cede8bbe
5
+ SHA512:
6
+ metadata.gz: f0899ab3cbd46626d7c1214b3a6c6912b0d6db747f3177d669b88d9c041d47bf62346b05f79f89c3ee5ed422ccde58b1237de2fc41a31c261956c3ddd0291ac5
7
+ data.tar.gz: b9d639a7c57e2bc49d3c37db1a1c0189e5fac2eb4a5b577a77e3f9a83b4a7aeb13b8464db7b274f3f7193758336f302dab7d3e67c67a6be72b64852e65e66923
@@ -0,0 +1,5 @@
1
+ --output-dir documentation/
2
+ --readme README.md
3
+ --title TVTid
4
+ --protected
5
+ library/**/*.rb
@@ -0,0 +1,2 @@
1
+ tvtid
2
+ =====
@@ -0,0 +1,16 @@
1
+ # encoding: utf-8
2
+
3
+ require 'net/http'
4
+
5
+ require 'oj'
6
+ require 'lrucache'
7
+ require 'multi_json'
8
+
9
+ require 'tvtid/client'
10
+ require 'tvtid/channel'
11
+ require 'tvtid/program'
12
+ require 'tvtid/schedule'
13
+ require 'tvtid/category'
14
+
15
+ module TVTid
16
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+
3
+ module TVTid
4
+ # A category for an EPG entry.
5
+ class Category
6
+ attr_accessor :color, :shade
7
+ attr_reader :name
8
+
9
+ # Constructs a new category with a name.
10
+ def initialize name
11
+ @name = name
12
+ end
13
+
14
+ # Creates a new category from a json object.
15
+ #
16
+ # @returns a category.
17
+ def self.from_json json
18
+ return nil unless json['name']
19
+
20
+ Category.new(json['name']).tap do |category|
21
+ category.color = json['color']
22
+ category.shade = json['shade']
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+
3
+ module TVTid
4
+ class Channel
5
+ attr_accessor :icon, :logo, :logo_svg, :category, :region, :language
6
+ attr_reader :id, :title
7
+
8
+ # Constructs a new channel with an id and a title.
9
+ def initialize id, title
10
+ @id = id
11
+ @title = title
12
+ end
13
+
14
+ # Creates a new channel from a json object.
15
+ #
16
+ # @returns a channel.
17
+ def self.from_json json
18
+ return nil unless json['id'] and json['title']
19
+
20
+ Channel.new(json['id'], json['title']).tap do |channel|
21
+ channel.icon = json['icon']
22
+ channel.logo = json['logo']
23
+ channel.logo_svg = json['svgLogo']
24
+ channel.category = json['category']
25
+ channel.region = json['region']
26
+ channel.language = json['lang']
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,79 @@
1
+ # encoding: utf-8
2
+
3
+ module TVTid
4
+ class Client
5
+ # The cache time to live.
6
+ CACHE_TTL = 1 * 60 * 60 * 24 # 1 day
7
+ # The soft cache time to live.
8
+ CACHE_SOFT_TTL = 7 * 60 * 60 * 24 # 7 days
9
+ # The API backend host.
10
+ API_BASE_URI = URI 'http://tvtid-app-backend.tv2.dk'
11
+
12
+ # The default HTTP request headers
13
+ HTTP_REQUEST_HEADERS = {
14
+ 'User-Agent' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36'
15
+ }
16
+
17
+ # The default channels to return in a days schedule
18
+ DEFAULT_CHANNELS = [1, 3, 5, 2, 31, 133, 7, 6, 4, 10155, 10154, 10153, 8,
19
+ 77, 156, 10093, 10066, 14, 10089, 12566, 10111, 70,
20
+ 118, 153, 94, 12948, 145, 185, 157, 15, 71, 93, 15049,
21
+ 219, 37, 248, 186]
22
+
23
+ # Constructs a new client
24
+ def initialize
25
+ @cache = LRUCache.new ttl: CACHE_TTL, soft_ttl: CACHE_SOFT_TTL
26
+ @http = Net::HTTP.new API_BASE_URI.host, API_BASE_URI.port
27
+ end
28
+
29
+ # Returns a schedule for the given date
30
+ #
31
+ # @param date A date
32
+ # @param channels A list of channel ids to request schedules for
33
+ def schedules_for date, channels = []
34
+ return nil unless date.is_a? Date
35
+
36
+ channels = self.channels.select{|c| DEFAULT_CHANNELS.include? c.id } if channels.empty?
37
+ formatted_date = date.iso8601
38
+ cache_key = "schedule-#{formatted_date}-#{channels.map(&:id).join ','}"
39
+
40
+ @cache.fetch cache_key do
41
+ channel_queries = channels.map{|c| "ch=#{c.id}" }.join '&'
42
+ response = @http.get "/api/tvtid/v1/dayviews/#{formatted_date}?#{channel_queries}", HTTP_REQUEST_HEADERS
43
+ json_data = MultiJson.load response.body
44
+
45
+ json_data.map do |schedule|
46
+ channel = channels.find{|channel| channel.id == schedule['id']}
47
+ programs = schedule['programs'].map{|program| Program.from_json program }
48
+
49
+ Schedule.new channel, programs
50
+ end
51
+ end
52
+ end
53
+
54
+ # Returns a list of schedules for today
55
+ #
56
+ # This is the same as using `schedules_for Date.today`
57
+ def schedules_for_today channels = []
58
+ schedules_for Date.today, channels
59
+ end
60
+
61
+ # Returns a days schedule for a given channel and date
62
+ #
63
+ # @param channel [Channel] The channel to get the schedule for
64
+ # @param date [Date] The date of the schedule
65
+ def channel_schedule channel, date = Date.today
66
+ schedules_for(date, [channel]).first
67
+ end
68
+
69
+ # Returns a list of channels
70
+ def channels
71
+ @cache.fetch 'channels' do
72
+ response = @http.get '/api/tvtid/v1/channels', HTTP_REQUEST_HEADERS
73
+
74
+ json_data = MultiJson.load response.body
75
+ json_data.map{|json_channel_data| Channel.from_json json_channel_data }
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,64 @@
1
+ module TVTid
2
+ class Program
3
+ # The id of the program.
4
+ attr_reader :id
5
+ # The title of the program.
6
+ attr_reader :title
7
+ # The time the program starts at.
8
+ attr_accessor :start_time
9
+ # The time the program stops at.
10
+ attr_accessor :stop_time
11
+ # A url where the user can see more information about the program.
12
+ attr_accessor :url
13
+ # The ID of the channel.
14
+ attr_accessor :channel_id
15
+ # The category of the program.
16
+ attr_accessor :category
17
+ # The description of the program.
18
+ attr_accessor :description
19
+ # The original non-localized title of the program.
20
+ attr_accessor :original_title
21
+ # The year of production of the program.
22
+ attr_accessor :production_year
23
+ # The production country of the program.
24
+ attr_accessor :production_country
25
+ # Teaser text for the program.
26
+ attr_accessor :teaser
27
+ # Unique series id if the program is a series.
28
+ attr_accessor :series_id
29
+ # Episode and season information if the program is a series.
30
+ attr_accessor :series_info
31
+
32
+ # Constructs a new `Program` with an `id` and a `title`.
33
+ def initialize id, title
34
+ @id = id
35
+ @title = title
36
+ end
37
+
38
+ # Updates the program information from a json object.
39
+ def parse_json! json
40
+ @start_time = Time.at(json['start']).to_datetime
41
+ @stop_time = Time.at(json['stop']).to_datetime
42
+ @url = json['url'] if json.key?('url')
43
+ @channel_id = json['channelId'] if json.key?('channelId')
44
+ @category = json['category'] if json.key?('category')
45
+ @description = json['desc'] if json.key?('desc')
46
+ @production_year = json['prodYear'] if json.key?('prodYear')
47
+ @production_country = json['prodCountry'] if json.key?('prodCountry')
48
+ @teaser = json['teaser'] if json.key?('teaser')
49
+ @series_id = json['series_id'] if json.key?('seriesId')
50
+ @series_info = json['series'] if json.key?('series')
51
+ end
52
+
53
+ # Constructs a `Program` from a json object.
54
+ #
55
+ # @returns Program if json object has an `id` and a `title` - nil otherwise.
56
+ def self.from_json json
57
+ return nil unless json['id'] and json['title']
58
+
59
+ Program.new(json['id'], json['title']).tap do |program|
60
+ program.parse_json! json
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,14 @@
1
+ module TVTid
2
+ class Schedule
3
+ # The channel the schedule belongs to.
4
+ attr_reader :channel
5
+ # The list of programs in the schedule.
6
+ attr_reader :programs
7
+
8
+ # Constructs a new schedule for a `channel`.
9
+ def initialize channel, programs = []
10
+ @channel = channel
11
+ @programs = programs
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ module TVTid
2
+ Version = '0.1'
3
+ end
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tvtid
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Mikkel Kroman
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-01-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: multi_json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.12'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: lrucache
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.4
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.4
41
+ - !ruby/object:Gem::Dependency
42
+ name: oj
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.18'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.18'
55
+ description:
56
+ email: mk@uplink.io
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - ".yardopts"
62
+ - README.md
63
+ - library/tvtid.rb
64
+ - library/tvtid/category.rb
65
+ - library/tvtid/channel.rb
66
+ - library/tvtid/client.rb
67
+ - library/tvtid/program.rb
68
+ - library/tvtid/schedule.rb
69
+ - library/tvtid/version.rb
70
+ homepage: https://github.com/mkroman/tvtid
71
+ licenses:
72
+ - MIT
73
+ metadata: {}
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - library
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 1.9.1
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ requirements: []
89
+ rubyforge_project:
90
+ rubygems_version: 2.5.2
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: Client library for tvtid.tv2.dk
94
+ test_files: []