ttvdb 0.0.2 → 0.0.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0f175e7222b5c8c526e4594e50438168996e2402
4
- data.tar.gz: ba8694c7d81d5b004b694bc967ef21b6cac185dc
3
+ metadata.gz: 64f19e256a1cc6ee78fb68e18b8058f9cc452f8a
4
+ data.tar.gz: 002b47931f2199e77320ed238e997a68126b60fa
5
5
  SHA512:
6
- metadata.gz: 444a34b040bb8b3fe64c87c48ae307497cc39034e2dfdc893c1e1901b0b8fe3fc400690be2ef5196f527e7d77893150d56350c44cd44ff4512efe49e2ed49320
7
- data.tar.gz: 7c0de0ccc8d84595c9665699d2d7b5db0efaa4ca02437a7dd31076efb4e64fca08fc7bd6e69a7630e50a6aace62356261e52c5dbe8140c5379cc80ab18f0c2df
6
+ metadata.gz: 1abc5a4db7d907c1b1cc84827c1da232121d594001a742ade3519a8fafc9cb1b71d5dc707fd30b782d16e0bb6826d8377fc0b8442625be76852441fc2f7886af
7
+ data.tar.gz: e3a4ead1586d3e21ede28cc75aedeb99f8f8dadf612e31847d9e9d664e2b7998283e5cc017deb261df85f21a698297d8497ee8ce0379e7c9c2c58e1fc6dd7e64
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.0
data/README.md CHANGED
@@ -1,7 +1,14 @@
1
+ [![Build Status](https://travis-ci.org/lotherk/ttvdb.png?branch=master)](https://travis-ci.org/lotherk/ttvdb)
2
+
1
3
  # TTVDB
2
4
 
3
5
  This is another [TheTVDB.com](http://www.thetvdb.com) API library. The others out there didn't fit my needs (if they even worked).
4
6
 
7
+ Source code is available at [github](httsp://github.com/lotherk/ttvdb)
8
+
9
+ Documentation is available at [rubydoc.info](http://rubydoc.info/github/lotherk/ttvdb)
10
+
11
+ Gem is available at [rubygems.org](https://rubygems.org/gems/ttvdb)
5
12
 
6
13
  ## Installation
7
14
 
@@ -17,8 +24,19 @@ Or install it yourself as:
17
24
 
18
25
  $ gem install ttvdb
19
26
 
27
+ From source:
28
+
29
+ $ git clone https://github.com/lotherk/ttvdb
30
+ $ cd ttvdb
31
+ $ rake build
32
+ $ gem install pkg/ttvdb-VERSION.gem
33
+
20
34
  ## Usage
21
35
 
36
+ ### Using the CLI tools
37
+
38
+
39
+ ### Writing Code
22
40
  Require the gem
23
41
 
24
42
  ```ruby
@@ -31,23 +49,17 @@ Create a ```TTVDB::Client``` instance
31
49
  client = TTVDB::Client.new(options={})
32
50
  ```
33
51
 
52
+ Where ```options``` can be:
53
+
34
54
  | key | value | description
35
55
  | --- | :---: | --- |
36
56
  | ```:api_key``` | api key | Your TheTVDB API Key, *optional* |
37
57
  | ```:api_url``` | http://www.thetvdb.com/api/ | API Url, *optional* |
38
58
  | ```:language```|```en```,```de```,```fr```,... | The language code to use. Fallback is ```en```, *optional* |
39
59
 
40
- Fetch series by name. Returns an array of series if result count is more than 1.
41
-
42
- ```ruby
43
- series = client.get_series "Saber Rider"
44
- ```
45
-
46
- Results to an array of 3 ```TTVDB::Series``` instances.
47
-
48
60
  # Example
49
61
 
50
- This is an example script that fetches a series by ARGV. if ARGV is an integer, it ill fetch it by its id otherwise by its name. It will then print a little overview about the series.
62
+ This is an example script that fetches a series by ARGV. if ARGV is an integer, it will fetch it by its id otherwise by its name. It will then print a little overview about the series.
51
63
 
52
64
  ## Usage
53
65
  ```bash
@@ -93,7 +105,7 @@ See the ```examples/``` folder for a complete list of examples. I try to make th
93
105
 
94
106
  ## Contributing
95
107
 
96
- 1. Fork it ( http://github.com/<my-github-username>/ttvdb/fork )
108
+ 1. Fork it ( http://github.com/lotherk/ttvdb/fork )
97
109
  2. Create your feature branch (`git checkout -b my-new-feature`)
98
110
  3. Commit your changes (`git commit -am 'Add some feature'`)
99
111
  4. Push to the branch (`git push origin my-new-feature`)
data/Rakefile CHANGED
@@ -1 +1,8 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
8
+
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require 'ttvdb/cli'
3
+ TTVDB::CLI.main
@@ -2,11 +2,24 @@ require "rest-client"
2
2
  require "logger"
3
3
  require "xmlsimple"
4
4
  require "ttvdb/version"
5
+ require "ttvdb/match"
5
6
  require "ttvdb/client"
6
7
 
7
8
 
8
9
  module TTVDB
9
- def self.logger
10
- @logger ||= Logger.new(STDOUT)
10
+ def self.logger(output=STDOUT)
11
+ unless @logger
12
+ @logger = Logger.new(output)
13
+ @logger.formatter = proc { |severity, datetime, progname, msg|
14
+ kaller = caller[4]
15
+ file, ln, func = kaller.split(":")
16
+ _nil, func = func.split("`")
17
+ func.gsub!(/[<>']/, "")
18
+ file = File.basename(file)
19
+ "#{datetime} #{severity} #{file}:#{func}:#{ln}: #{msg}\n"
20
+ }
21
+ @logger.level = Logger::WARN
22
+ end
23
+ @logger
11
24
  end
12
25
  end
@@ -0,0 +1,7 @@
1
+ require 'ttvdb'
2
+
3
+ module TTVDB::CLI
4
+ def self.main
5
+
6
+ end
7
+ end
@@ -1,8 +1,9 @@
1
+ require 'ttvdb/parser'
1
2
  require 'ttvdb/series'
2
3
  require 'ttvdb/episode'
3
4
 
4
5
  class TTVDB::Client
5
- attr_writer :language
6
+ attr_accessor :language
6
7
 
7
8
  def initialize(opts = {})
8
9
  @opts = {
@@ -15,47 +16,38 @@ class TTVDB::Client
15
16
  end
16
17
 
17
18
  def get_series_by_id id
18
- lookup = "series/#{id}/#{@opts[:language]}.xml"
19
- begin
20
- hsh = XmlSimple.xml_in(client[lookup].get)
21
- return TTVDB::Series.new(hsh["Series"][0], :client => self)
22
- rescue Exception => e
23
- raise
24
- end
19
+ lookup = "series/#{id}/#{@language}.xml"
20
+ hsh = XmlSimple.xml_in(client[lookup].get)
21
+ serie = TTVDB::Series.new(hsh["Series"][0])
22
+ serie.client = self
23
+ return serie
25
24
  end
26
25
 
27
26
  def get_series name
28
27
  _client = RestClient::Resource.new("#{@opts[:api_url]}/GetSeries.php", :headers => { :params => { 'seriesname' => name, 'language' => @language }})
29
- begin
30
- hsh = XmlSimple.xml_in(_client.get)
31
- return [] unless hsh["Series"]
32
- series = []
33
- hsh["Series"].each do |s|
34
- serie = TTVDB::Series.new(s, :client => self)
35
- next if serie.language != @language
36
- series << serie
37
- end
38
- return series
39
- rescue Exception => e
40
- TTVDB.logger.error { "Error while fetching series: #{e.message}" }
41
- raise
28
+ hsh = XmlSimple.xml_in(_client.get)
29
+ return [] unless hsh["Series"]
30
+ series = []
31
+ hsh["Series"].each do |s|
32
+ serie = TTVDB::Series.new(s)
33
+ next if serie.language != @language
34
+ serie.client = self
35
+ series << serie
42
36
  end
37
+ return series
43
38
  end
44
39
 
45
40
  def get_episodes_by_series_id id
46
- lookup = "series/#{id}/all/#{@opts[:language]}.xml"
47
- begin
48
- hsh = XmlSimple.xml_in(client[lookup].get)
49
- return [] unless hsh["Episode"]
50
- episodes = []
51
- hsh["Episode"].each do |e|
52
- episodes << TTVDB::Episode.new(e, :client => self)
53
- end
54
- return episodes
55
- rescue Exception => e
56
- TTVDB.logger.error("get_episodes_by_series_id") { "Could not create hash from result: #{e.message}" }
57
- raise
41
+ lookup = "series/#{id}/all/#{@language}.xml"
42
+ hsh = XmlSimple.xml_in(client[lookup].get)
43
+ return [] unless hsh["Episode"]
44
+ episodes = []
45
+ hsh["Episode"].each do |e|
46
+ episode = TTVDB::Episode.new(e)
47
+ episode.client = self
48
+ episodes << episode
58
49
  end
50
+ episodes
59
51
  end
60
52
 
61
53
  private
@@ -1,21 +1,18 @@
1
1
  class TTVDB::Episode
2
- attr_reader :id, :number, :name, :overview, :season_id, :series_id,
3
- :combined_number, :combined_season
2
+ include TTVDB::Parser
4
3
 
5
- attr_writer :client, :series
4
+ attr_reader :id, :combined_episodenumber, :combined_season,
5
+ :dvd_chapter, :dvd_discid, :dvd_episodenumber, :dvd_season,
6
+ :director, :ep_img_flag, :episode_name, :name, :episode_number,
7
+ :number, :first_aired, :guest_stars, :imdb_id, :overview,
8
+ :last_updated, :rating, :absolute_number, :season_number,
9
+ :season_id, :series_id
6
10
 
7
- def initialize(data, options={})
8
- options.merge! data
9
- @id = options["id"][0].to_i rescue nil
10
- @number = options["EpisodeNumber"][0].to_i rescue nil
11
- @name = options["EpisodeName"][0] rescue nil
12
- @overview = options["Overview"][0] rescue nil
13
- @season_id = options["seasonid"][0].to_i rescue nil
14
- @series_id = options["seriesid"][0].to_i rescue nil
15
- @combined_number = options["Combined_episodenumber"][0].to_i rescue nil
16
- @combined_season = options["Combined_season"][0].to_i rescue nil
17
- @client = options[:client] rescue nil
18
- @series = options[:series] rescue nil
11
+ attr_accessor :client, :series
12
+
13
+ def initialize(data)
14
+ @data = Hash[data.map { |k, v| [k.downcase, v] }]
15
+ parse
19
16
  end
20
17
 
21
18
  end
@@ -0,0 +1,76 @@
1
+ require 'similar_text'
2
+ module TTVDB::Match
3
+ def match_episode filename, opts = {}
4
+ episode = nil
5
+ case opts[:filter]
6
+ when :sorted
7
+ episode = match_episode_sorted filename, opts
8
+ when :name
9
+ episode = match_episode_name filename, opts
10
+ when :regex
11
+ episode = match_episode_regex filename, opts
12
+ else
13
+ # try all
14
+ episode = match_episode_regex filename, opts rescue nil
15
+ episode ||= match_episode_name(filename, opts) rescue nil
16
+ episode ||= match_episode_regex(filename, opts) rescue nil
17
+ end
18
+ episode
19
+ end
20
+
21
+ private
22
+ def match_episode_sorted filename, opts = {}
23
+ enum = get_episode filename
24
+ return episodes[enum-1] rescue nil
25
+ end
26
+
27
+ def match_episode_name filename, opts = {}
28
+ results = []
29
+ episodes.each do |episode|
30
+ min = opts[:min]
31
+ min ||= 45
32
+ results << episode if episode.name.similar(filename) >= min
33
+ end
34
+ if results.count == 0
35
+ results = nil
36
+ elsif results.count == 1
37
+ results = results[0]
38
+ end
39
+ return results
40
+ end
41
+
42
+ def match_episode_regex filename, opts = {}
43
+ snum = get_season filename
44
+ enum = get_episode filename
45
+ seasons[snum][enum] rescue nil
46
+ end
47
+
48
+ def get_episode filename
49
+ filter_episode = [
50
+ /e(\d+)/i,
51
+ /(\d+)/i
52
+ ]
53
+ filter_episode.each do |r|
54
+ m = filename.match(r)
55
+ if m
56
+ return m[1].to_i rescue nil
57
+ end
58
+ end
59
+ end
60
+
61
+ def get_season filename
62
+ filter_season = [
63
+ /s(\d+)/i,
64
+ /season.*(\d+)/i,
65
+ /staffel.*(\d+)/i,
66
+ /(\d+)x/i,
67
+ /(\d+)-/i
68
+ ]
69
+ filter_season.each do |r|
70
+ m = filename.match(r)
71
+ if m
72
+ return m[1].to_i rescue nil
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,99 @@
1
+ module TTVDB::Parser
2
+ attr_reader :id
3
+
4
+ MAP = {
5
+ "id" => { :map => true, :cast => :integer },
6
+ "combined_episodenumber" => { :map => true, :cast => :float },
7
+ "combined_season" => { :map => true, :cast => :integer },
8
+ "dvd_chapter" => { :map => true, :cast => :integer },
9
+ "dvd_discid" => { :map => true, :cast => :integer },
10
+ "dvd_episodenumber" => { :map => true, :cast => :float },
11
+ "dvd_season" => { :map => true, :cast => :integer },
12
+ "director" => { :map => true },
13
+ "epimgflag" => { :map => true, :cast => :integer },
14
+ "episodename" => { :map => :name },
15
+ "episodenumber" => { :map => :number, :cast => :integer },
16
+ "firstaired" => { :map => :first_aired, :cast => :time },
17
+ "gueststars" => { :map => :guest_stars, :cast => :array },
18
+ "imdb_id" => { :map => true },
19
+ "language" => { :map => true },
20
+ "overview" => { :map => true },
21
+ "productioncode" => { :map => :production_code },
22
+ "rating" => { :map => true, :cast => :float },
23
+ "ratingcount" => { :map => :rating_count, :cast => :integer },
24
+ "seasonnumber" => { :map => :season_number, :cast => :integer },
25
+ "writer" => { :map => true },
26
+ "absolute_number" => { :map => true, :cast => :integer },
27
+ "filename" => { :map => true },
28
+ "lastupdated" => { :map => :last_updated, :cast => :time_at },
29
+ "seasonid" => { :map => :season_id, :cast => :integer },
30
+ "seriesid" => { :map => :series_id, :cast => :integer },
31
+ "thumb_added" => { :map => true },
32
+ "thumb_height" => { :map => true, :cast => :integer },
33
+ "thumb_width" => { :map => true, :cast => :integer },
34
+ "actors" => { :map => true, :cast => :array },
35
+ "airs_dayofweek" => { :map => true },
36
+ "airs_time" => { :map => true },
37
+ "contentrating" => { :map => :content_rating, :cast => :float },
38
+ "genre" => { :map => true, :cast => :array },
39
+ "network" => { :map => true },
40
+ "networkid" => { :map => :network_id },
41
+ "runtime" => { :map => true, :cast => :integer },
42
+ "seriesname" => { :map => :name },
43
+ "status" => { :map => true },
44
+ "added" => { :map => true },
45
+ "added_by" => { :map => true },
46
+ "banner" => { :map => true },
47
+ "fanart" => { :map => true },
48
+ "poster" => { :map => true },
49
+ "zap2it_id" => { :map => true }
50
+ }
51
+
52
+ def parse
53
+ raise "no data to parse" unless @data
54
+ @data.each do |k, v|
55
+ k = k.downcase
56
+ v = v[0]
57
+ unless MAP.include? k
58
+ next
59
+ end
60
+ var = nil
61
+ if MAP[k][:map].is_a? TrueClass
62
+ var = k.to_sym
63
+ else
64
+ var = MAP[k][:map].to_sym
65
+ end
66
+
67
+ unless respond_to? var
68
+ next
69
+ end
70
+ k, v = map k, v
71
+ instance_variable_set("@#{k}", v)
72
+ end
73
+ @data = nil
74
+ end
75
+
76
+ private
77
+ def map k, v
78
+ case MAP[k][:cast]
79
+ when :integer
80
+ v = v.to_i rescue v
81
+ when :float
82
+ v = v.to_f rescue v
83
+ when :array
84
+ v = v.split("|").compact rescue v
85
+ when :time_at
86
+ v = Time.at(v.to_i) rescue v
87
+ when :time
88
+ v = Time.parse(v) rescue v
89
+ else
90
+ v = v
91
+ end
92
+ if MAP[k][:map].is_a? TrueClass
93
+ k = k.to_sym
94
+ else
95
+ k = MAP[k][:map].to_sym
96
+ end
97
+ [k, v]
98
+ end
99
+ end
@@ -1,49 +1,25 @@
1
1
  class TTVDB::Series
2
+ include TTVDB::Parser
3
+ include TTVDB::Match
4
+
2
5
  attr_reader :id, :actors, :airs_dayofweek, :airs_time,
3
6
  :content_rating, :first_aired, :genre, :imdb_id, :language,
4
7
  :network, :network_id, :overview, :rating, :rating_count,
5
8
  :runtime, :series_id, :series_name, :status, :added, :added_by,
6
- :banner, :fanart, :last_updated, :poster, :zap2it_id, :episodes, :seasons,
9
+ :banner, :fanart, :last_updated, :poster, :zap2it_id, :seasons,
7
10
  :name
8
11
 
9
- attr_writer :client
12
+ attr_accessor :client
10
13
 
11
- def initialize(data, options={})
12
- options.merge! data
13
- @id = options["id"][0].to_i rescue nil
14
- @actors = options["Actors"][0].split("|").compact rescue []
15
- @airs_dayofweek = options["Airs_DayOfWeek"][0] rescue nil
16
- @airs_time = options["Airs_Time"][0] rescue nil
17
- @content_rating = options["ContentRating"][0].to_f rescue 0
18
- @first_aired = Time.parse(options["FirstAired"][0]) rescue nil
19
- @genre = options["Genre"][0].split("|").compact rescue []
20
- @imdb_id = options["IMDB_ID"][0].to_i rescue nil
21
- @language = options["language"][0] rescue nil
22
- @language ||= options["Language"][0] rescue "en"
23
- @network = options["Network"][0] rescue nil
24
- @network_id = options["NetworkID"][0] rescue nil
25
- @overview = options["Overview"][0] rescue nil
26
- @rating = options["Rating"][0].to_f rescue 0
27
- @rating_count = options["RatingCount"][0] rescue 0
28
- @runtime = options["Runtime"][0].to_i rescue nil
29
- @runtime ||= options["runtime"][0].to_i rescue 0
30
- @series_id = options["SeriesID"][0].to_i rescue nil
31
- @series_name = options["SeriesName"][0] rescue nil
32
- @name = @series_name
33
- @status = options["Status"][0].downcase rescue nil
34
- @added = options["added"][0] rescue nil
35
- @added_by = options["addedBy"][0] rescue nil
36
- @banner = options["banner"][0] rescue nil
37
- @fanart = options["fanart"][0] rescue nil
38
- @last_updated = Time.at(options["lastupdated"][0].to_i) rescue nil
39
- @poster = options["poster"][0] rescue nil
40
- @zap2it_id = options["zap2it_id"][0] rescue nil
41
- @client = options[:client] rescue nil
14
+ def initialize(data)
15
+ @data = Hash[data.map { |k, v| [k.downcase, v] }]
16
+ parse
42
17
  @seasons = {}
43
- TTVDB.logger.debug { "Series language: #{@language}" }
44
- fetch_episodes
45
18
  end
46
19
 
20
+ def episodes
21
+ @episodes ||= fetch_episodes
22
+ end
47
23
 
48
24
  private
49
25
  def fetch_episodes