imdb_title 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f2fc3cac635deca895d0d4189f92b175b023091c7e69e5fd6adb96802c6ad5a2
4
+ data.tar.gz: 949e0fc71c0ff76bf11dcf29b1770a7674c8976b8cc728dea6da89da2b60772f
5
+ SHA512:
6
+ metadata.gz: fa0263da758fc96f977e4b0065df386f646b1686bd96c14dfeba2f748936ef06c372ef50cf2e96f2de4749cbe99d4f691abf818d2fc99b06017f8d2c10bafeaa
7
+ data.tar.gz: 74379acd1efe8174758e61f37af49ba8733ea1abcce7dc562fbcae9c8fddd6d06fd3c5e6c94c5fdf1bd0ef20d39465b5c581ca0a01d4d259f2db78d358bbd637
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IMDb
4
+ # All custom errors will inherit from this class
5
+ class Error < StandardError; end
6
+
7
+ # Will raise this error for incorrect url input
8
+ class InvalidURL < Error; end
9
+
10
+ # Will raise this error if URL is UNSUPPORTED title type
11
+ class UnSupportedType < InvalidURL; end
12
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ ##
5
+ ##
6
+ ###### ---------------- List of features/data avialable to extract -----------------------
7
+ ### All features are available from Base class
8
+
9
+ ##
10
+ ##
11
+ ##
12
+
13
+ # features exclusive to Episode title type
14
+ module Episode
15
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ ##
5
+ ##
6
+ ###### ---------------- List of features/data avialable to extract -----------------------
7
+ ### All features are available from Base class
8
+
9
+ #### ------- BOX OFFICE ---------
10
+ ### 12. Budget
11
+ ### 13. Gross Worldwide (Revenue)
12
+ ##
13
+ ##
14
+ ##
15
+
16
+ # features exclusive to Movie title type
17
+ module Movie
18
+ # returns budget price of the movie
19
+ def budget
20
+ document.css("li[data-testid=title-boxoffice-budget] div").text[/\$\S+/]
21
+ end
22
+
23
+ # returns revenue price of the movie
24
+ def revenue
25
+ inspect_this document.css("li[data-testid=title-boxoffice-cumulativeworldwidegross] div").text
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ ##
5
+ ##
6
+ ###### ---------------- List of features/data avialable to extract -----------------------
7
+ ### All features are available from Base class
8
+
9
+ ##
10
+ ##
11
+ ##
12
+
13
+ # features exclusive to Tv-Show title type
14
+ module TvShow
15
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ ##
5
+ ##
6
+ ###### ---------------- List of features/data avialable to extract -----------------------
7
+ ### All features are available from Base class
8
+
9
+ ##
10
+ ##
11
+ ##
12
+
13
+ # features exclusive to Video Game title type
14
+ module VideoGame
15
+ # remove duration instance method as its not relevant for the game object
16
+ def self.extended(obj)
17
+ obj.class.instance_eval do
18
+ undef_method :duration
19
+ end
20
+ end
21
+ end
data/lib/imdb.rb ADDED
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "require_all"
4
+ require "nokogiri"
5
+ require "httparty"
6
+ require_all "lib/imdb/"
7
+
8
+ ##
9
+ ##
10
+ ##
11
+ ###### ---------------- List of features/data avialable to extract -----------------------
12
+ ### 1. Cast
13
+ ### 2. Director
14
+ ### 3. Genres
15
+ ### 4. IMDb ID
16
+ ### 5. Popularity
17
+ ### 6. Ratings
18
+ ### 7. Title
19
+ ### 8. Tagline
20
+ #### ------- DETAILS ---------
21
+ ### 9. Prodcution Companies
22
+ ### 10. Release Date
23
+ #### ------- TECHNICAL SPECS ---------
24
+ ### 11. Runtime
25
+ ##
26
+ ##
27
+ ##
28
+
29
+ # :reek:TooManyMethods
30
+ module IMDb
31
+ # Extracts common data from titles - Movie, TV-shows, Episode, Game from imdb.com
32
+ class Title
33
+ # pass valid imdb title url
34
+ def initialize(url)
35
+ raise InvalidURL, "Please input a valid IMDb URL" unless valid?(url)
36
+
37
+ case title_type
38
+ when "video.movie" then extend Movie
39
+ when "video.tv_show" then extend TvShow
40
+ when "video.episode" then extend Episode
41
+ when "video.other" then extend VideoGame
42
+ else raise UnSupportedTypeError, "Unknown title type"
43
+ end
44
+ end
45
+
46
+ # returns list of casts
47
+ def casts
48
+ split_these document.css("a[data-testid=title-cast-item__actor]").text
49
+ end
50
+
51
+ # returns list of directors
52
+ def directors
53
+ html = document.css("li[data-testid=title-pc-principal-credit]")
54
+ text = html.text
55
+ return unless text.include? "Director"
56
+
57
+ split_these html.css("ul").first.text
58
+ end
59
+
60
+ # returns runtime of the title
61
+ def duration
62
+ inspect_this document.css("li[data-testid=title-techspec_runtime] div").text
63
+ end
64
+
65
+ # returns list of genres
66
+ def genres
67
+ split_these document.css("div[data-testid=genres]").text
68
+ end
69
+
70
+ # returns a unique id set by imdb
71
+ def imdb_id
72
+ document.css("meta[property*=pageConst]").attribute("content").value
73
+ end
74
+
75
+ # returns number of users rated
76
+ def popularity
77
+ document.css("div[data-testid=hero-rating-bar__aggregate-rating] span div").last&.text
78
+ end
79
+
80
+ # returns list of production companies
81
+ def production_companies
82
+ split_these document.css("li[data-testid=title-details-companies] li").text
83
+ end
84
+
85
+ # returns user average rating score
86
+ def ratings
87
+ document.css("div[data-testid=hero-rating-bar__aggregate-rating__score] span").first&.text
88
+ end
89
+
90
+ # returns release date
91
+ def release_date
92
+ inspect_this document.css("li[data-testid=title-details-releasedate] div").text
93
+ end
94
+
95
+ # returns short introduction of the title
96
+ def tagline
97
+ inspect_this document.css("span[data-testid=plot-xl]").text
98
+ end
99
+
100
+ # returns name of the title
101
+ def title
102
+ document.css("h1").text
103
+ end
104
+
105
+ def url
106
+ document.css("meta[property*=url]").attribute("content").value
107
+ end
108
+
109
+ private
110
+
111
+ attr_reader :document
112
+
113
+ # checks IMDb id from URL (dosen't return 404 Error Page)
114
+ def correct_id?(url)
115
+ response = HTTParty.get(url, {headers: {"User-Agent" => "Httparty"}})
116
+ @document = Nokogiri::HTML(response.body)
117
+ document.title != "404 Error - IMDb"
118
+ end
119
+
120
+ # :reek:UtilityFunction
121
+ # returns proper output
122
+ def inspect_this(input)
123
+ if input.empty?
124
+ nil
125
+ elsif input.length == 1
126
+ input.join
127
+ else
128
+ input
129
+ end
130
+ end
131
+
132
+ # spilits camel case names to array
133
+ def split_these(names)
134
+ list = names.split(/(?<=[a-z)])(?=[A-Z])/)
135
+ inspect_this(list)
136
+ end
137
+
138
+ # returns type of title
139
+ def title_type
140
+ document.css("meta[property*=type]").attribute("content").value
141
+ end
142
+
143
+ # validates domain name, slug & IMDb ID length and returns title page
144
+ def valid?(url)
145
+ url.match?("https://www.imdb.com/title/tt#{/\d+{7,}/i}") && correct_id?(url)
146
+ end
147
+ end
148
+ end
metadata ADDED
@@ -0,0 +1,141 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: imdb_title
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Juzer Shakir
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-10-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.21.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.21.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.15'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 1.15.4
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '1.15'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.15.4
47
+ - !ruby/object:Gem::Dependency
48
+ name: require_all
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: reek
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '6.1'
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 6.1.4
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '6.1'
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 6.1.4
81
+ - !ruby/object:Gem::Dependency
82
+ name: standard
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '1.31'
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 1.31.1
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '1.31'
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 1.31.1
101
+ description: |2
102
+ Want to know everything about your favorite movies, TV shows, episodes, and games?
103
+ Look no further than our data extraction tool! All the information you need such as
104
+ title, tagline, ratings, casts, productions, etc will be a method call away.
105
+ email: juzershakir.webdev@gmail.com
106
+ executables: []
107
+ extensions: []
108
+ extra_rdoc_files: []
109
+ files:
110
+ - lib/imdb.rb
111
+ - lib/imdb/exceptions.rb
112
+ - lib/imdb/titles/episode.rb
113
+ - lib/imdb/titles/movie.rb
114
+ - lib/imdb/titles/tv_show.rb
115
+ - lib/imdb/titles/video_game.rb
116
+ homepage: https://github.com/JuzerShakir/imdb
117
+ licenses:
118
+ - MIT
119
+ - GPL-2.0
120
+ metadata:
121
+ source_code_uri: https://github.com/JuzerShakir/imdb
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ requirements: []
137
+ rubygems_version: 3.4.20
138
+ signing_key:
139
+ specification_version: 4
140
+ summary: Access info of any Movie, Tv Show, Episode or Game from imdb.com
141
+ test_files: []