shin 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 75593124b977e12576cd7cc859216eb6d3d5d3dc
4
- data.tar.gz: d2940ba29adeff8c32faf158bf268a54deb3d6a9
3
+ metadata.gz: 9c016c0787c6b653275ff7617bc9c91e1fe63bbc
4
+ data.tar.gz: f2a6b501aa0e7db1dd6e03b2f42fa5d46b82b8d0
5
5
  SHA512:
6
- metadata.gz: 6340c7d4d97b5e22a1c9153df2d21babec9fb502fdc912977ce287eb3d42f2224110dab61594dbcf4900f1dda55c01ba895ba6a1deba5ac5e2359ca58e0a4cbc
7
- data.tar.gz: 6020e9a25cc8da2d2d1d480f9a58a58418c4af5600d0f8f25480a62a84f18d54c4514e5c6e939dc46228eb3fd5c842dd7bf8b2733c8d67c94b2ba3b8a351ee46
6
+ metadata.gz: d6e61a9e6bae07ae46fdda9192500ad2092ab24643eaa51656417a86c61b6e1ca1bafcc2edd19753d88059fde25a72ecb6e88d1dbe170b5cc26ef7e60b086a97
7
+ data.tar.gz: 2f15aa1623a2f07946e890de499ae577ead857c431d309ec0ca2215b68d8bff0832b3f8e645b4d333fb0b324fb75ee90d6c2cc3013f81117827ff54bd193c4e0
data/lib/shin/data/dfi.rb CHANGED
@@ -12,11 +12,11 @@ module Shin
12
12
  # Search (on title)
13
13
  def search(params={})
14
14
  raise MissingArgument, "You are missing the argument 'title' which is required to use this source." unless params[:title] != ""
15
- year = params[:year] != "" ? params[:year] : nil
15
+ params[:year] ||= nil
16
16
 
17
17
  # Response
18
- if year != nil
19
- response = Base.get('http://nationalfilmografien.service.dfi.dk/movie.svc/list?titlecontains=' + URI.encode(params[:title]) + '&startyear='+(year - 1).to_s+'&endyear='+(year + 1).to_s)
18
+ if params[:year] != nil
19
+ response = Base.get('http://nationalfilmografien.service.dfi.dk/movie.svc/list?titlecontains=' + URI.encode(params[:title]) + '&startyear='+(params[:year] - 1).to_s+'&endyear='+(params[:year] + 1).to_s)
20
20
  else
21
21
  response = Base.get('http://nationalfilmografien.service.dfi.dk/movie.svc/list?titlecontains=' + URI.encode(params[:title]))
22
22
  end
@@ -34,7 +34,7 @@ module Shin
34
34
  doc.xpath("//MovieListItems/MovieListItem").each do |item|
35
35
 
36
36
  # If year is nil then return all
37
- if year != nil
37
+ if params[:year] != nil
38
38
  return {id: item.xpath('./ID').text.to_i, name: item.xpath('./Name').text, url: item.xpath('./Url').text}.to_hashugar
39
39
  else
40
40
  @array << {id: item.xpath('./ID').text.to_i, name: item.xpath('./Name').text, url: item.xpath('./Url').text}
@@ -0,0 +1,64 @@
1
+ # DFI provides an OPEN API
2
+ require 'date'
3
+
4
+ module Shin
5
+ module Data
6
+ class Previewnetworks
7
+
8
+ def new
9
+ self
10
+ end
11
+
12
+ # Fix these before running
13
+ def before(params={})
14
+ raise MissingArgument, "You are missing the argument 'previewnetworks_key' which is required to use this source." unless Shin.get[:previewnetworks_key] != nil
15
+
16
+ # Timestamp
17
+ Shin.get[:previewnetworks_country] ||= "se"
18
+
19
+ "http://" + Shin.get[:previewnetworks_country] + ".feed.previewnetworks.com"
20
+ end
21
+
22
+ # Search (on title)
23
+ def search(params={})
24
+ url = before()
25
+
26
+ # Response
27
+ response = Base.get(url + '/v3.1/all/search-2/' + Shin.get[:previewnetworks_key] + '/?' + URI.encode_www_form(params))
28
+ raise HTTPError, "The response didn't have a 200 HTTP Code. It had #{response.code}." unless response.code == 200
29
+
30
+ # Data, it can be multiple reviews for a single movie from different reviewers
31
+ doc = Nokogiri::XML(response.body)
32
+
33
+ doc.remove_namespaces!
34
+ data = []
35
+ doc.xpath("//previewnetworks/movies/movie").each do |d|
36
+ data << Hash.from_xml(d.to_xml)[:movie]
37
+ end
38
+
39
+ data.to_hashugar
40
+ end
41
+
42
+ # Info
43
+ def info(params={})
44
+ url = before()
45
+
46
+ # Response
47
+ response = Base.get(url + '/v3.1/all/' + params[:id].to_s + '/' + Shin.get[:previewnetworks_key] + '/?' + URI.encode_www_form(params))
48
+ raise HTTPError, "The response didn't have a 200 HTTP Code. It had #{response.code}." unless response.code == 200
49
+
50
+ # Data, it can be multiple reviews for a single movie from different reviewers
51
+ doc = Nokogiri::XML(response.body)
52
+
53
+ doc.remove_namespaces!
54
+ data = {}
55
+ doc.xpath("//previewnetworks/movies/movie").each do |d|
56
+ data = Hash.from_xml(d.to_xml)[:movie]
57
+ end
58
+
59
+ data.to_hashugar
60
+ end
61
+
62
+ end
63
+ end
64
+ end
data/lib/shin/data/sfi.rb CHANGED
@@ -13,12 +13,12 @@ module Shin
13
13
  def search(params={})
14
14
  raise MissingArgument, "You are missing the argument 'title' which is required to use this source." unless params[:title] != ""
15
15
 
16
- type = params[:type] == "" ? params[:type] : "MovieTitle"
17
- match = params[:match] == "" ? params[:match] : "Begin"
18
- year = params[:year] != "" ? params[:year] : nil
16
+ params[:type] ||= "MovieTitle"
17
+ params[:match] ||= "Begin"
18
+ params[:year] ||= nil
19
19
 
20
20
  # Response
21
- response = Base.get('http://www.sfi.se/sv/svensk-filmdatabas/sokresultat/?searchword=' + URI.encode(params[:title]) + '&type=' + type + '&match=' + match + '&prom=False')
21
+ response = Base.get('http://www.sfi.se/sv/svensk-filmdatabas/sokresultat/?searchword=' + URI.encode(params[:title]) + '&type=' + params[:type] + '&match=' + params[:match] + '&prom=False')
22
22
  raise HTTPError, "The response didn't have a 200 HTTP Code. It had #{response.code}." unless response.code == 200
23
23
 
24
24
  # Nokogiri parse
@@ -36,9 +36,9 @@ module Shin
36
36
  @country = e.text[/\((\d+), (.*)\)/, 2].to_s rescue nil
37
37
 
38
38
  # Find one or get all? (Allow years to be one less or one more aswell)
39
- if year == nil
39
+ if params[:year] == nil
40
40
  @array << {id: @id.to_i, title: @title, year: @year, country: @country}
41
- elsif @year == year or (@year - 1) == year or (@year + 1) == year
41
+ elsif @year == params[:year] or (@year - 1) == params[:year] or (@year + 1) == params[:year]
42
42
  # It should only return a single one if you have specified a year
43
43
  return {id: @id.to_i, title: @title, year: @year, country: @country}.to_hashugar
44
44
  end
data/lib/shin/data.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require_relative 'data/sfi'
2
2
  require_relative 'data/dfi'
3
3
  require_relative 'data/viasat'
4
+ require_relative 'data/previewnetworks'
5
+ require_relative 'hash'
4
6
 
5
7
  module Shin
6
8
  module Data
@@ -10,17 +12,26 @@ module Shin
10
12
  self
11
13
  end
12
14
 
15
+ # SFI HTML
13
16
  def sfi
14
17
  @sfi ||= Sfi.new
15
18
  end
16
19
 
20
+ # DFI API
17
21
  def dfi
18
22
  @dfi ||= Dfi.new
19
23
  end
20
24
 
25
+ # Viasat API (Images only atm)
21
26
  def viasat
22
27
  @viasat ||= Viasat.new
23
28
  end
29
+
30
+ # Previewnetworks API
31
+ def previewnetworks
32
+ @previewnetworks ||= Previewnetworks.new
33
+ end
34
+
24
35
  end
25
36
  end
26
37
  end
data/lib/shin/hash.rb ADDED
@@ -0,0 +1,63 @@
1
+ # USAGE: Hash.from_xml:(YOUR_XML_STRING)
2
+ require 'nokogiri'
3
+ # modified from http://stackoverflow.com/questions/1230741/convert-a-nokogiri-document-to-a-ruby-hash/1231297#1231297
4
+
5
+ class Hash
6
+ class << self
7
+ def from_xml(xml_io)
8
+ begin
9
+ result = Nokogiri::XML(xml_io)
10
+ return { result.root.name.to_sym => xml_node_to_hash(result.root)}
11
+ rescue Exception => e
12
+ # raise your custom exception here
13
+ end
14
+ end
15
+
16
+ def xml_node_to_hash(node)
17
+ # If we are at the root of the document, start the hash
18
+ if node.element?
19
+ result_hash = {}
20
+ if node.attributes != {}
21
+ result_hash[:attributes] = {}
22
+ node.attributes.keys.each do |key|
23
+ result_hash[:attributes][node.attributes[key].name.to_sym] = prepare(node.attributes[key].value)
24
+ end
25
+ end
26
+ if node.children.size > 0
27
+ node.children.each do |child|
28
+ result = xml_node_to_hash(child)
29
+
30
+ if child.name == "text"
31
+ unless child.next_sibling || child.previous_sibling
32
+ return prepare(result)
33
+ end
34
+ elsif result_hash[child.name.to_sym]
35
+ if result_hash[child.name.to_sym].is_a?(Object::Array)
36
+ result_hash[child.name.to_sym] << prepare(result)
37
+ else
38
+ result_hash[child.name.to_sym] = [result_hash[child.name.to_sym]] << prepare(result)
39
+ end
40
+ else
41
+ result_hash[child.name.to_sym] = prepare(result)
42
+ end
43
+ end
44
+
45
+ return result_hash
46
+ else
47
+ return result_hash
48
+ end
49
+ else
50
+ return prepare(node.content.to_s)
51
+ end
52
+ end
53
+
54
+ def prepare(data)
55
+ (data.class == String && data.to_i.to_s == data) ? data.to_i : data
56
+ end
57
+ end
58
+
59
+ def to_struct(struct_name)
60
+ Struct.new(struct_name,*keys).new(*values)
61
+ end
62
+ end
63
+
@@ -168,7 +168,7 @@ module HTTParty #:nodoc:
168
168
 
169
169
  # ===== Store objects in memory
170
170
  #
171
- Struct.new("TvdbResponse", :code, :body, :headers) { def to_s; self.body; end }
171
+ Struct.new("ShinResponse", :code, :body, :headers) { def to_s; self.body; end }
172
172
  class MemoryStore < AbstractStore
173
173
  def initialize(options={})
174
174
  super; @store = {}; self
@@ -0,0 +1,52 @@
1
+ ## Apple Provides a OPEN API
2
+ ## Docs: https://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html
3
+ module Shin
4
+ module Play
5
+ class Apple
6
+
7
+ def new
8
+ self
9
+ end
10
+
11
+ # Search
12
+ def search(params={})
13
+ # Response
14
+ response = Base.get('https://itunes.apple.com/search?' + URI.encode_www_form(params))
15
+ raise HTTPError, "The response didn't have a 200 HTTP Code. It had #{response.code}." unless response.code == 200
16
+
17
+ # Data
18
+ data = Oj.load(response.body) rescue nil
19
+ d2 = data['results'] rescue nil
20
+
21
+ if d2 != nil
22
+ d2.to_hashugar
23
+ else
24
+ raise NotValid, "Couldn't find any responses/results please check again."
25
+ end
26
+
27
+ end
28
+
29
+ # Find
30
+ def find(params={})
31
+ # Response
32
+ response = Base.get('https://itunes.apple.com/lookup?' + URI.encode_www_form(params))
33
+ raise HTTPError, "The response didn't have a 200 HTTP Code. It had #{response.code}." unless response.code == 200
34
+
35
+ # Data
36
+ data = Oj.load(response.body) rescue nil
37
+ d2 = data['results'] rescue nil
38
+
39
+ if d2 != nil
40
+ d2.first.to_hashugar
41
+ else
42
+ raise NotValid, "Couldn't find any responses/results please check again."
43
+ end
44
+ end
45
+
46
+ # Errors
47
+ class NotValid < StandardError; end
48
+ class MissingArgument < StandardError; end
49
+ class HTTPError < StandardError; end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,42 @@
1
+ ## HBO Nordic have a REST API but isn't for public use
2
+ module Shin
3
+ module Play
4
+ class Hbonordic
5
+
6
+ def new
7
+ self
8
+ end
9
+
10
+ # Category
11
+ def all(params={})
12
+ raise NotValid, "Not a valid category. Please check again." unless ["movies", "series"].include?(params[:category])
13
+
14
+ # Response
15
+ response = Base.get('http://hbonordic.se/rest-services-hook/' + params[:category])
16
+
17
+ # They place movies in a "entry" tag somehow
18
+ if params[:category] == "movies"
19
+ response.parsed_response['entry'].to_hashugar
20
+ else
21
+ response.parsed_response.to_hashugar
22
+ end
23
+ end
24
+
25
+ # Info
26
+ def info(params={})
27
+ raise NotValid, "Not a valid category. Please check again." unless ["movies", "series"].include?(params[:category])
28
+
29
+ # Response
30
+ response = Base.get('http://hbonordic.se/rest-services-hook/' + params[:category] + '/' + params[:id])
31
+
32
+ # Data
33
+ response.parsed_response.to_hashugar
34
+ end
35
+
36
+ # Errors
37
+ class NotValid < StandardError; end
38
+ class MissingArgument < StandardError; end
39
+ class HTTPError < StandardError; end
40
+ end
41
+ end
42
+ end
@@ -34,7 +34,7 @@ module Shin
34
34
 
35
35
  # Channels
36
36
  def channels(params={})
37
- page = params[:page] == "" ? params[:type] : 1
37
+ params[:page] ||= 1
38
38
 
39
39
  # Response
40
40
  response = Base.get('http://playapi.mtgx.tv/v3/channels?' + URI.encode_www_form(params))
data/lib/shin/play.rb CHANGED
@@ -10,7 +10,12 @@ require_relative 'play/viasat'
10
10
  #require_relative 'play/headweb'
11
11
  #require_relative 'play/film2home'
12
12
  #require_relative 'play/plejmo'
13
- #require_relative 'play/hbonordic'
13
+ #require_relative 'play/sfanytime'
14
+ require_relative 'play/apple'
15
+ #require_relative 'play/cmore'
16
+ #require_relative 'play/filmnet'
17
+ #require_relative 'play/discshop'
18
+ require_relative 'play/hbonordic'
14
19
 
15
20
  module Shin
16
21
  module Play
@@ -55,6 +60,16 @@ module Shin
55
60
  @viasat ||= Viasat.new
56
61
  end
57
62
 
63
+ # HBO Nordic (NORDIC CONTENT)
64
+ def hbonordic
65
+ @hbonordic ||= Hbonordic.new
66
+ end
67
+
68
+ # Apple iTunes (WORLDWIDE CONTENT)
69
+ def apple
70
+ @apple ||= Apple.new
71
+ end
72
+
58
73
  end
59
74
  end
60
75
  end
data/lib/shin/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Shin
2
- VERSION = "0.1.0"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joakim Nylen
@@ -96,10 +96,14 @@ files:
96
96
  - lib/shin/base.rb
97
97
  - lib/shin/data.rb
98
98
  - lib/shin/data/dfi.rb
99
+ - lib/shin/data/previewnetworks.rb
99
100
  - lib/shin/data/sfi.rb
100
101
  - lib/shin/data/viasat.rb
102
+ - lib/shin/hash.rb
101
103
  - lib/shin/httparty_icebox.rb
102
104
  - lib/shin/play.rb
105
+ - lib/shin/play/apple.rb
106
+ - lib/shin/play/hbonordic.rb
103
107
  - lib/shin/play/oppetarkiv.rb
104
108
  - lib/shin/play/sbstv.rb
105
109
  - lib/shin/play/svtplay.rb