filmaffinity 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +43 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +32 -0
- data/README.md +1 -0
- data/Rakefile +5 -0
- data/filmaffinity.gemspec +18 -0
- data/lib/filmaffinity/movie.rb +84 -0
- data/lib/filmaffinity/search.rb +43 -0
- data/lib/filmaffinity/top.rb +0 -0
- data/spec/filmaffinity/matchers/include-movie.rb +7 -0
- data/spec/filmaffinity/movie_spec.rb +103 -0
- data/spec/filmaffinity/search_spec.rb +50 -0
- data/spec/spec_helper.rb +3 -0
- metadata +62 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59143d52d028335079f76b6cb8c075310c7b53fe
|
4
|
+
data.tar.gz: 48d2789e4b105327f6d5075a3d52cfe2952cfa44
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72e2a3cd9099bac624451f145cc5986635cb9498a0bcf9ef0ca201021c0ae1b549b65c2642a398f7dc82415017284c39d63fbcd77ab923fc710daead1c7c65dc
|
7
|
+
data.tar.gz: 914916c362fe6188a508abc63fb2fea7f8b291f723cce40cd55a9c90924852f5ac20bf1a3b402489c29a837713d70931cb994730d579064f715a656f6b0d2b30
|
data/.gitignore
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
## Ignore Mac DS_Store files
|
2
|
+
.DS_Store
|
3
|
+
## Ignore test folder
|
4
|
+
/.test/
|
5
|
+
|
6
|
+
*.gem
|
7
|
+
*.rbc
|
8
|
+
/.config
|
9
|
+
/coverage/
|
10
|
+
/InstalledFiles
|
11
|
+
/pkg/
|
12
|
+
/spec/reports/
|
13
|
+
/test/tmp/
|
14
|
+
/test/version_tmp/
|
15
|
+
/tmp/
|
16
|
+
|
17
|
+
## Specific to RubyMotion:
|
18
|
+
.dat*
|
19
|
+
.repl_history
|
20
|
+
build/
|
21
|
+
|
22
|
+
## Documentation cache and generated files:
|
23
|
+
/.yardoc/
|
24
|
+
/_yardoc/
|
25
|
+
/doc/
|
26
|
+
/rdoc/
|
27
|
+
|
28
|
+
## Environment normalisation:
|
29
|
+
/.bundle/
|
30
|
+
/vendor/bundle
|
31
|
+
/lib/bundler/man/
|
32
|
+
|
33
|
+
# for a library or gem, you might want to ignore these files since the code is
|
34
|
+
# intended to run in multiple environments; otherwise, check them in:
|
35
|
+
# Gemfile.lock
|
36
|
+
# .ruby-version
|
37
|
+
# .ruby-gemset
|
38
|
+
|
39
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
40
|
+
.rvmrc
|
41
|
+
|
42
|
+
# playground file
|
43
|
+
/playground.rb
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
diff-lcs (1.2.5)
|
5
|
+
fakeweb (1.3.0)
|
6
|
+
mini_portile2 (2.0.0)
|
7
|
+
nokogiri (1.6.7.2)
|
8
|
+
mini_portile2 (~> 2.0.0.rc2)
|
9
|
+
rspec (3.4.0)
|
10
|
+
rspec-core (~> 3.4.0)
|
11
|
+
rspec-expectations (~> 3.4.0)
|
12
|
+
rspec-mocks (~> 3.4.0)
|
13
|
+
rspec-core (3.4.4)
|
14
|
+
rspec-support (~> 3.4.0)
|
15
|
+
rspec-expectations (3.4.0)
|
16
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
17
|
+
rspec-support (~> 3.4.0)
|
18
|
+
rspec-mocks (3.4.1)
|
19
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
20
|
+
rspec-support (~> 3.4.0)
|
21
|
+
rspec-support (3.4.1)
|
22
|
+
|
23
|
+
PLATFORMS
|
24
|
+
ruby
|
25
|
+
|
26
|
+
DEPENDENCIES
|
27
|
+
fakeweb
|
28
|
+
nokogiri
|
29
|
+
rspec
|
30
|
+
|
31
|
+
BUNDLED WITH
|
32
|
+
1.11.2
|
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
#FilmAffinity Scraper Gem
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'filmaffinity'
|
3
|
+
s.version = '0.0.2'
|
4
|
+
s.date = '2016-04-05'
|
5
|
+
s.summary = "filmaffinity"
|
6
|
+
s.description = "Easily use Ruby or the command line to find information on Filmaffinity.com"
|
7
|
+
s.authors = ["David Santos, Oriol Bellido"]
|
8
|
+
s.email = 'dsantosmerino92@gmail.com'
|
9
|
+
s.files = `git ls-files`.split("\n")
|
10
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
11
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
12
|
+
s.require_paths = ['lib']
|
13
|
+
s.homepage = 'http://rubygems.org/gems/filmaffinity'
|
14
|
+
s.license = 'MIT'
|
15
|
+
s.add_dependency 'nokogiri', ' ~> 1.6'
|
16
|
+
s.add_development_dependency 'rake', '~> 10.0'
|
17
|
+
s.add_development_dependency 'rspec', '~> 3.3'
|
18
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module FilmAffinity
|
2
|
+
class Movie
|
3
|
+
attr_reader :id, :title
|
4
|
+
def initialize id,title
|
5
|
+
@id = id
|
6
|
+
@title = title
|
7
|
+
end
|
8
|
+
|
9
|
+
def document_html
|
10
|
+
@document_html ||= Nokogiri::HTML(self.generate_html)
|
11
|
+
end
|
12
|
+
|
13
|
+
def generate_html
|
14
|
+
open("http://www.filmaffinity.com/es/film#{@id}.html")
|
15
|
+
end
|
16
|
+
|
17
|
+
def year
|
18
|
+
document_html.at('dd[itemprop="datePublished"]').content[/\d+/].to_i
|
19
|
+
end
|
20
|
+
|
21
|
+
def duration
|
22
|
+
document_html.at('dd[itemprop="duration"]').content[/\d+/].to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
def country
|
26
|
+
raw_country = document_html.at("#country-img").next_sibling.content
|
27
|
+
raw_country.gsub(/\A[[:space:]]+|[[:space:]]+\z/, '')
|
28
|
+
end
|
29
|
+
|
30
|
+
def director
|
31
|
+
raw_director = document_html.at('a[itemprop="url"]').content
|
32
|
+
raw_director.strip
|
33
|
+
end
|
34
|
+
|
35
|
+
def script
|
36
|
+
document_html.at('dt:contains("Guión")').next_sibling.next_sibling.content
|
37
|
+
end
|
38
|
+
|
39
|
+
def music
|
40
|
+
document_html.at('dt:contains("Música")').next_sibling.next_sibling.content
|
41
|
+
end
|
42
|
+
|
43
|
+
def photography
|
44
|
+
document_html.at('dt:contains("Fotografía")').next_sibling.next_sibling.content
|
45
|
+
end
|
46
|
+
|
47
|
+
def cast
|
48
|
+
actors = []
|
49
|
+
node = document_html.search('span[itemprop="actor"]')
|
50
|
+
node.each do |actor|
|
51
|
+
actors << actor.at('span[itemprop="name"]').content.strip
|
52
|
+
end
|
53
|
+
actors
|
54
|
+
end
|
55
|
+
|
56
|
+
def company
|
57
|
+
document_html.at('dt:contains("Productora")').next_sibling.next_sibling.content
|
58
|
+
end
|
59
|
+
|
60
|
+
def genres
|
61
|
+
genres = []
|
62
|
+
node = document_html.at('dt:contains("Género")').next_sibling.next_sibling
|
63
|
+
raw_genres = node.search("a")
|
64
|
+
raw_genres.each do |raw_genre|
|
65
|
+
genres << raw_genre.content.strip
|
66
|
+
end
|
67
|
+
genres
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
def sinopsis
|
72
|
+
document_html.at('dd[itemprop="description"]').content
|
73
|
+
end
|
74
|
+
|
75
|
+
def prizes
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
def rating
|
80
|
+
raw_rating = document_html.at('div[itemprop="ratingValue"]').content.strip
|
81
|
+
raw_rating.gsub(",",".").to_f
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "cgi"
|
2
|
+
|
3
|
+
module FilmAffinity
|
4
|
+
class Search
|
5
|
+
def initialize query
|
6
|
+
@query = query
|
7
|
+
end
|
8
|
+
|
9
|
+
def movies
|
10
|
+
@movies ||= (exact_match? ? parse_movie : parse_movies)
|
11
|
+
end
|
12
|
+
|
13
|
+
def exact_match?
|
14
|
+
!document_html.at(".z-movie").nil?
|
15
|
+
end
|
16
|
+
|
17
|
+
def document_html
|
18
|
+
@document_html ||= Nokogiri::HTML(self.generate_html)
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate_html
|
22
|
+
open("http://www.filmaffinity.com/es/search.php?stext=#{CGI.escape(@query)}&stype=title")
|
23
|
+
end
|
24
|
+
|
25
|
+
def parse_movie
|
26
|
+
id = document_html.at('meta[property="og:url"]')['content'][/\d+/].to_i
|
27
|
+
title = document_html.at('meta[property="og:title"]')['content']
|
28
|
+
[FilmAffinity::Movie.new(id,title)]
|
29
|
+
end
|
30
|
+
|
31
|
+
def parse_movies
|
32
|
+
movies = []
|
33
|
+
document_html.search(".movie-card.movie-card-1").each do |movie_card|
|
34
|
+
id = movie_card["data-movie-id"].to_i
|
35
|
+
title = movie_card.search(".mc-title a").first.content.strip
|
36
|
+
movie = FilmAffinity::Movie.new id, title
|
37
|
+
movies << movie
|
38
|
+
end
|
39
|
+
movies
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
File without changes
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require_relative "../spec_helper"
|
2
|
+
|
3
|
+
describe "FilmAffinity::Movie" do
|
4
|
+
|
5
|
+
describe "#rating" do
|
6
|
+
subject(:movie) { FilmAffinity::Movie.new(504889, "El show de Truman (Una vida en directo)") }
|
7
|
+
it "should return an Float" do
|
8
|
+
expect(movie.rating).to be_a(Float)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#year" do
|
13
|
+
subject(:movie) { FilmAffinity::Movie.new(504889, "El show de Truman (Una vida en directo)") }
|
14
|
+
it "should return an Fixnum" do
|
15
|
+
expect(movie.year).to be_an(Fixnum)
|
16
|
+
end
|
17
|
+
it "should return 1998" do
|
18
|
+
expect(movie.year).to eq(1998)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#duration" do
|
23
|
+
subject(:movie) { FilmAffinity::Movie.new(504889, "El show de Truman (Una vida en directo)") }
|
24
|
+
it "should return an Fixnum" do
|
25
|
+
expect(movie.duration).to be_a(Fixnum)
|
26
|
+
end
|
27
|
+
it "should return 103" do
|
28
|
+
expect(movie.duration).to eq(103)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#country" do
|
33
|
+
subject(:movie) { FilmAffinity::Movie.new(504889, "El show de Truman (Una vida en directo)") }
|
34
|
+
it "should return a String" do
|
35
|
+
expect(movie.country).to be_a(String)
|
36
|
+
end
|
37
|
+
it "should return 'Estados Unidos'" do
|
38
|
+
expect(movie.country).to eq("Estados Unidos")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#director" do
|
43
|
+
subject(:movie) { FilmAffinity::Movie.new(504889, "El show de Truman (Una vida en directo)") }
|
44
|
+
it "should return a String" do
|
45
|
+
expect(movie.director).to be_a(String)
|
46
|
+
end
|
47
|
+
it "should return 'Peter Weir'" do
|
48
|
+
expect(movie.director).to eq("Peter Weir")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#script" do
|
53
|
+
subject(:movie) { FilmAffinity::Movie.new(504889, "El show de Truman (Una vida en directo)") }
|
54
|
+
it "should return a String" do
|
55
|
+
expect(movie.script).to be_a(String)
|
56
|
+
end
|
57
|
+
it "should return 'Andrew Niccol'" do
|
58
|
+
expect(movie.script).to eq("Andrew Niccol")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#cast" do
|
63
|
+
subject(:movie) { FilmAffinity::Movie.new(504889, "El show de Truman (Una vida en directo)") }
|
64
|
+
it "should return an Array" do
|
65
|
+
expect(movie.cast).to be_an(Array)
|
66
|
+
end
|
67
|
+
it "should to include the passed cast" do
|
68
|
+
expected_cast = [
|
69
|
+
"Jim Carrey",
|
70
|
+
"Laura Linney",
|
71
|
+
"Noah Emmerich",
|
72
|
+
"Ed Harris"
|
73
|
+
]
|
74
|
+
expect(movie.cast).to include(*expected_cast)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "#company" do
|
79
|
+
subject(:movie) { FilmAffinity::Movie.new(504889, "El show de Truman (Una vida en directo)") }
|
80
|
+
it "should return a String" do
|
81
|
+
expect(movie.company).to be_a(String)
|
82
|
+
end
|
83
|
+
it "should return 'Paramount Pictures / Scott Rudin Productions'" do
|
84
|
+
expect(movie.company).to eq("Paramount Pictures / Scott Rudin Productions")
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "#genres" do
|
89
|
+
subject(:movie) { FilmAffinity::Movie.new(504889, "El show de Truman (Una vida en directo)") }
|
90
|
+
it "should return an Array" do
|
91
|
+
expect(movie.genres).to be_an(Array)
|
92
|
+
end
|
93
|
+
it "should to include the passed genres" do
|
94
|
+
expected_genres = [
|
95
|
+
"Drama",
|
96
|
+
"Comedia",
|
97
|
+
"Sátira"
|
98
|
+
]
|
99
|
+
expect(movie.genres).to include(*expected_genres)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require_relative "../spec_helper"
|
2
|
+
require_relative "matchers/include-movie"
|
3
|
+
|
4
|
+
|
5
|
+
describe "FilmAffinity::Search" do
|
6
|
+
|
7
|
+
describe "#create_document_html" do
|
8
|
+
subject(:search) { FilmAffinity::Search.new("truman") }
|
9
|
+
|
10
|
+
it "#create_document_html" do
|
11
|
+
document_html = search.document_html
|
12
|
+
expect(document_html).to be_an(Nokogiri::HTML::Document)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#movies" do
|
18
|
+
subject(:search) { FilmAffinity::Search.new("truman") }
|
19
|
+
|
20
|
+
it "should return an array" do
|
21
|
+
movies = search.movies
|
22
|
+
expect(movies).to be_an(Array)
|
23
|
+
end
|
24
|
+
it "should return just FilmAffinity::Movie objects only" do
|
25
|
+
movies = search.movies
|
26
|
+
movies.each { |movie| expect(movie).to be_an(FilmAffinity::Movie) }
|
27
|
+
end
|
28
|
+
it "should include 'Truman Show'" do
|
29
|
+
movies = search.movies
|
30
|
+
truman_movie = FilmAffinity::Movie.new 504889, "El show de Truman (Una vida en directo)"
|
31
|
+
expect(movies).to include_movie(truman_movie)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#parse_movie" do
|
36
|
+
#Get a direct result from a specific searchs
|
37
|
+
subject(:search) { FilmAffinity::Search.new("truman show") }
|
38
|
+
|
39
|
+
it "should parse id" do
|
40
|
+
id = 504889
|
41
|
+
expect(id).to eq(search.movies.first.id)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should parse title" do
|
45
|
+
title = "El show de Truman (Una vida en directo) (1998)"
|
46
|
+
expect(title).to eq(search.movies.first.title)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: filmaffinity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Santos, Oriol Bellido
|
@@ -9,14 +9,69 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
date: 2016-04-05 00:00:00.000000000 Z
|
12
|
-
dependencies:
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nokogiri
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.3'
|
13
55
|
description: Easily use Ruby or the command line to find information on Filmaffinity.com
|
14
56
|
email: dsantosmerino92@gmail.com
|
15
57
|
executables: []
|
16
58
|
extensions: []
|
17
59
|
extra_rdoc_files: []
|
18
60
|
files:
|
61
|
+
- ".gitignore"
|
62
|
+
- Gemfile
|
63
|
+
- Gemfile.lock
|
64
|
+
- README.md
|
65
|
+
- Rakefile
|
66
|
+
- filmaffinity.gemspec
|
19
67
|
- lib/filmaffinity.rb
|
68
|
+
- lib/filmaffinity/movie.rb
|
69
|
+
- lib/filmaffinity/search.rb
|
70
|
+
- lib/filmaffinity/top.rb
|
71
|
+
- spec/filmaffinity/matchers/include-movie.rb
|
72
|
+
- spec/filmaffinity/movie_spec.rb
|
73
|
+
- spec/filmaffinity/search_spec.rb
|
74
|
+
- spec/spec_helper.rb
|
20
75
|
homepage: http://rubygems.org/gems/filmaffinity
|
21
76
|
licenses:
|
22
77
|
- MIT
|
@@ -41,5 +96,9 @@ rubygems_version: 2.4.6
|
|
41
96
|
signing_key:
|
42
97
|
specification_version: 4
|
43
98
|
summary: filmaffinity
|
44
|
-
test_files:
|
99
|
+
test_files:
|
100
|
+
- spec/filmaffinity/matchers/include-movie.rb
|
101
|
+
- spec/filmaffinity/movie_spec.rb
|
102
|
+
- spec/filmaffinity/search_spec.rb
|
103
|
+
- spec/spec_helper.rb
|
45
104
|
has_rdoc:
|