filmaffinity 1.1.2 → 1.1.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 +5 -5
- data/.github/workflows/ci.yml +34 -0
- data/.rubocop.yml +6 -3
- data/Gemfile +10 -2
- data/Gemfile.lock +50 -21
- data/README.md +3 -2
- data/Rakefile +2 -0
- data/filmaffinity.gemspec +25 -19
- data/lib/constants/constants.rb +52 -47
- data/lib/filmaffinity/configuration.rb +1 -0
- data/lib/filmaffinity/{json-movie-parser.rb → json_movie_parser.rb} +5 -2
- data/lib/filmaffinity/{json-movies-parser.rb → json_movies_parser.rb} +5 -7
- data/lib/filmaffinity/movie.rb +30 -34
- data/lib/filmaffinity/{poster-manager.rb → poster_manager.rb} +7 -4
- data/lib/filmaffinity/search.rb +17 -12
- data/lib/filmaffinity/top.rb +22 -14
- data/lib/filmaffinity/version.rb +5 -0
- data/lib/filmaffinity.rb +14 -11
- data/spec/filmaffinity/{json-movie-parser_spec.rb → json_movie_parser_spec.rb} +6 -3
- data/spec/filmaffinity/{json-movies-parser_spec.rb → json_movies_parser_spec.rb} +6 -3
- data/spec/filmaffinity/movie_spec.rb +65 -130
- data/spec/filmaffinity/search_spec.rb +13 -20
- data/spec/filmaffinity/top_spec.rb +65 -72
- data/spec/filmaffinity/version_spec.rb +15 -0
- data/spec/{filmaffinity/matchers/include-movie.rb → matchers/include_movie.rb} +3 -1
- data/spec/spec_helper.rb +8 -1
- data/spec/vcr/FilmAffinity_Movie/english_version/_cast/includes_the_passed_cast.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_cast/returns_an_Array.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_company/returns_Paramount_Pictures_Scott_Rudin_Productions_.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_company/returns_a_String.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_country/returns_United_States_.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_country/returns_a_String.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_director/returns_Peter_Weir_.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_director/returns_a_String.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_duration/returns_103.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_duration/returns_an_Integer.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_genres/includes_the_passed_genres.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_genres/returns_an_Array.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_poster/returns_a_String.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_poster/returns_a_jpg_address.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_rating/returns_an_Float.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_script/returns_Andrew_Niccol_.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_script/returns_a_String.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_title/returns_an_valid_title_when_initializes_with_no_title.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_year/returns_1998.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/english_version/_year/returns_an_Integer.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_cast/includes_the_passed_cast.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_cast/returns_an_Array.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_company/returns_Paramount_Pictures_Scott_Rudin_Productions_.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_company/returns_a_String.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_country/returns_Estados_Unidos_.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_country/returns_a_String.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_director/returns_Peter_Weir_.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_director/returns_a_String.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_duration/returns_103.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_duration/returns_an_Integer.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_genres/includes_the_passed_genres.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_genres/returns_an_Array.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_poster/returns_a_String.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_poster/returns_a_jpg_address.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_rating/returns_an_Float.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_script/returns_Andrew_Niccol_.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_script/returns_a_String.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_title/returns_an_valid_title_when_initializes_with_no_title.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_year/returns_1998.yml +59 -0
- data/spec/vcr/FilmAffinity_Movie/spanish_version/_year/returns_an_Integer.yml +59 -0
- data/spec/vcr/FilmAffinity_Search/_movies/includes_the_The_Truman_Show_.yml +63 -0
- data/spec/vcr/FilmAffinity_Search/_movies/includes_the_Truman_Show_.yml +63 -0
- data/spec/vcr/FilmAffinity_Search/_movies/returns_FilmAffinity_Movie_objects_only.yml +63 -0
- data/spec/vcr/FilmAffinity_Search/_movies/returns_an_array.yml +63 -0
- data/spec/vcr/FilmAffinity_Search/_parse_movie/parses_the_id.yml +114 -0
- data/spec/vcr/FilmAffinity_Search/_parse_movie/parses_the_title.yml +114 -0
- data/spec/vcr/FilmAffinity_Top/_movies/no_options/includes_El_Padrino_.yml +63 -0
- data/spec/vcr/FilmAffinity_Top/_movies/no_options/includes_The_Godfather_.yml +63 -0
- data/spec/vcr/FilmAffinity_Top/_movies/no_options/returns_30_movies.yml +63 -0
- data/spec/vcr/FilmAffinity_Top/_movies/no_options/returns_FilmAffinity_Movie_objects_only.yml +63 -0
- data/spec/vcr/FilmAffinity_Top/_movies/no_options/returns_an_array.yml +63 -0
- data/spec/vcr/FilmAffinity_Top/_movies/with_options/only_with_limit/set_to_10/returns_10_movies.yml +63 -0
- data/spec/vcr/FilmAffinity_Top/_movies/with_options/only_with_limit/set_to_132/returns_132_movies.yml +303 -0
- data/spec/vcr/FilmAffinity_Top/_movies/with_options/only_with_limit/set_to_60/does_not_include_Con_la_muerte_en_los_talones_.yml +123 -0
- data/spec/vcr/FilmAffinity_Top/_movies/with_options/only_with_limit/set_to_60/includes_American_History_X_.yml +123 -0
- data/spec/vcr/FilmAffinity_Top/_movies/with_options/only_with_limit/set_to_60/returns_60_movies.yml +123 -0
- data/spec/vcr/FilmAffinity_Top/_movies/with_options/with_genre_BE_and_country_code_DE_/includes_Generation_War_TV_Miniseries_.yml +125 -0
- data/spec/vcr/FilmAffinity_Top/_movies/with_options/with_genre_BE_and_country_code_DE_/includes_Hijos_del_Tercer_Reich_Miniserie_de_TV_.yml +125 -0
- data/spec/vcr/FilmAffinity_Top/_movies/with_options/with_genre_BE_and_country_code_DE_/returns_FilmAffinity_Movie_objects_only.yml +125 -0
- data/spec/vcr/FilmAffinity_Top/_movies/with_options/with_genre_BE_and_country_code_DE_/returns_an_array.yml +125 -0
- data/spec/vcr/JsonMovieParser/_to_hash/returns_the_right_director_for_the_given_movie.yml +59 -0
- data/spec/vcr/JsonMoviesParser/_to_hashes/returns_some_valid_ids_for_a_given_search.yml +63 -0
- metadata +162 -31
- data/.rubocop_todo.yml +0 -48
- data/.travis.yml +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a9088f75d64b8f2421c88d12ac936cfa80c90a6bd5e42fae80fdf3dfdd47f1d4
|
4
|
+
data.tar.gz: a0156abae8630d24c0b287050e22d3d7040f3b02267ae883bbb414cff37cc1cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 383b5ab1107b601b3b03e71fee4efeee526c8ac05028d42d4e17cf71e5cf6e90230c8a3ee090e64f175784260e895b9e5253b6e06332f3b53a637440aec1a87b
|
7
|
+
data.tar.gz: 55baab9211fd1bfae9aa390a2d3a82e847a88fef5f81b783b7766632dc2d1d7845da8cefedcb9e4aa3cfb6fd998626160c397cd1c0eb913a43ecd24df2c446ed
|
@@ -0,0 +1,34 @@
|
|
1
|
+
name: CI
|
2
|
+
on: [push, pull_request]
|
3
|
+
jobs:
|
4
|
+
rubocop:
|
5
|
+
runs-on: ubuntu-latest
|
6
|
+
name: Rubocop
|
7
|
+
steps:
|
8
|
+
- uses: actions/checkout@v2
|
9
|
+
- name: Set up Ruby 2.7
|
10
|
+
uses: actions/setup-ruby@v1
|
11
|
+
with:
|
12
|
+
ruby-version: 2.7
|
13
|
+
- name: Install dependencies
|
14
|
+
run: gem install rubocop
|
15
|
+
- name: Rubocop
|
16
|
+
run: rubocop
|
17
|
+
test:
|
18
|
+
runs-on: ubuntu-latest
|
19
|
+
strategy:
|
20
|
+
matrix:
|
21
|
+
ruby: [ '2.5', '2.6', '2.7' ]
|
22
|
+
name: Test w/ Ruby ${{ matrix.ruby }}
|
23
|
+
steps:
|
24
|
+
- uses: actions/checkout@v2
|
25
|
+
- name: Set up Ruby ${{ matrix.ruby }}
|
26
|
+
uses: actions/setup-ruby@v1
|
27
|
+
with:
|
28
|
+
ruby-version: ${{ matrix.ruby }}
|
29
|
+
- name: Install dependencies
|
30
|
+
run: |
|
31
|
+
gem install bundler
|
32
|
+
bundle install --jobs 4 --retry 3
|
33
|
+
- name: RSpec
|
34
|
+
run: bundle exec rspec --order rand
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,33 +1,43 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
filmaffinity (1.1.
|
4
|
+
filmaffinity (1.1.2)
|
5
5
|
imgur-api (~> 0)
|
6
|
-
json (
|
7
|
-
nokogiri (
|
6
|
+
json (>= 1.8, < 3.0)
|
7
|
+
nokogiri (>= 1.8.1)
|
8
8
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
11
11
|
specs:
|
12
|
-
|
12
|
+
addressable (2.7.0)
|
13
|
+
public_suffix (>= 2.0.2, < 5.0)
|
14
|
+
ast (2.4.1)
|
15
|
+
crack (0.4.4)
|
13
16
|
diff-lcs (1.2.5)
|
14
|
-
|
17
|
+
hashdiff (1.0.1)
|
18
|
+
httparty (0.18.1)
|
19
|
+
mime-types (~> 3.0)
|
15
20
|
multi_xml (>= 0.5.2)
|
16
21
|
imgur-api (0.0.4)
|
17
22
|
httparty
|
18
|
-
json (
|
19
|
-
|
20
|
-
|
23
|
+
json (2.3.1)
|
24
|
+
mime-types (3.3.1)
|
25
|
+
mime-types-data (~> 3.2015)
|
26
|
+
mime-types-data (3.2020.0512)
|
27
|
+
mini_portile2 (2.5.1)
|
21
28
|
multi_xml (0.6.0)
|
22
|
-
nokogiri (1.
|
23
|
-
mini_portile2 (~> 2.
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
29
|
+
nokogiri (1.11.4)
|
30
|
+
mini_portile2 (~> 2.5.0)
|
31
|
+
racc (~> 1.4)
|
32
|
+
parallel (1.19.2)
|
33
|
+
parser (2.7.2.0)
|
34
|
+
ast (~> 2.4.1)
|
35
|
+
public_suffix (4.0.6)
|
36
|
+
racc (1.5.2)
|
37
|
+
rainbow (3.0.0)
|
38
|
+
rake (12.3.3)
|
39
|
+
regexp_parser (1.8.1)
|
40
|
+
rexml (3.2.5)
|
31
41
|
rspec (3.4.0)
|
32
42
|
rspec-core (~> 3.4.0)
|
33
43
|
rspec-expectations (~> 3.4.0)
|
@@ -41,16 +51,35 @@ GEM
|
|
41
51
|
diff-lcs (>= 1.2.0, < 2.0)
|
42
52
|
rspec-support (~> 3.4.0)
|
43
53
|
rspec-support (3.4.1)
|
44
|
-
|
54
|
+
rubocop (0.92.0)
|
55
|
+
parallel (~> 1.10)
|
56
|
+
parser (>= 2.7.1.5)
|
57
|
+
rainbow (>= 2.2.2, < 4.0)
|
58
|
+
regexp_parser (>= 1.7)
|
59
|
+
rexml
|
60
|
+
rubocop-ast (>= 0.5.0)
|
61
|
+
ruby-progressbar (~> 1.7)
|
62
|
+
unicode-display_width (>= 1.4.0, < 2.0)
|
63
|
+
rubocop-ast (0.7.1)
|
64
|
+
parser (>= 2.7.1.5)
|
65
|
+
ruby-progressbar (1.10.1)
|
66
|
+
unicode-display_width (1.7.0)
|
67
|
+
vcr (6.0.0)
|
68
|
+
webmock (3.9.2)
|
69
|
+
addressable (>= 2.3.6)
|
70
|
+
crack (>= 0.3.2)
|
71
|
+
hashdiff (>= 0.4.0, < 2.0.0)
|
45
72
|
|
46
73
|
PLATFORMS
|
47
74
|
ruby
|
48
75
|
|
49
76
|
DEPENDENCIES
|
50
77
|
filmaffinity!
|
51
|
-
|
52
|
-
rake (~> 10.0)
|
78
|
+
rake (~> 12.3)
|
53
79
|
rspec (~> 3.3)
|
80
|
+
rubocop
|
81
|
+
vcr
|
82
|
+
webmock
|
54
83
|
|
55
84
|
BUNDLED WITH
|
56
|
-
1.
|
85
|
+
2.1.4
|
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
# FilmAffinity
|
2
|
-
|
1
|
+
# FilmAffinity Gem
|
2
|
+
|
3
|
+
[](https://github.com/dsantosmerino/filmaffinity-gem/actions)
|
3
4
|
[](http://badge.fury.io/rb/filmaffinity)
|
4
5
|
|
5
6
|
## Description
|
data/Rakefile
CHANGED
data/filmaffinity.gemspec
CHANGED
@@ -1,20 +1,26 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
1
|
+
# frozen_string_literal: false
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path("lib", __dir__)
|
4
|
+
|
5
|
+
require 'filmaffinity/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |gem|
|
8
|
+
gem.name = 'filmaffinity'
|
9
|
+
gem.version = FilmAffinity::VERSION
|
10
|
+
gem.summary = 'filmaffinity'
|
11
|
+
gem.description = 'Easily use Ruby or the command line to find information on Filmaffinity.com'
|
12
|
+
gem.authors = ['David Santos', 'Oriol Bellido']
|
13
|
+
gem.email = 'dsantosmerino@gmail.com'
|
14
|
+
gem.files = `git ls-files`.split("\n")
|
15
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
17
|
+
gem.require_paths = ['lib']
|
18
|
+
gem.homepage = 'https://github.com/davidsantosmerino/filmaffinity-gem'
|
19
|
+
gem.license = 'MIT'
|
20
|
+
gem.add_dependency 'imgur-api', '~> 0'
|
21
|
+
gem.add_dependency 'json', '>= 1.8', '< 3.0'
|
22
|
+
gem.add_dependency 'nokogiri', '>= 1.8.1'
|
23
|
+
gem.add_development_dependency 'rake', '~> 12.3'
|
24
|
+
gem.add_development_dependency 'rspec', '~> 3.3'
|
25
|
+
gem.required_ruby_version = '>= 2.5.0'
|
20
26
|
end
|
data/lib/constants/constants.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Constants
|
2
4
|
def self.query_params
|
3
5
|
{
|
@@ -18,75 +20,78 @@ module Constants
|
|
18
20
|
}
|
19
21
|
end
|
20
22
|
|
23
|
+
# rubocop:disable Metrics/MethodLength
|
21
24
|
def self.tags
|
22
25
|
{
|
23
26
|
|
24
|
-
title: {
|
25
|
-
|
27
|
+
title: {
|
28
|
+
EN: '#main-title span',
|
29
|
+
ES: '#main-title span'
|
26
30
|
},
|
27
|
-
|
28
|
-
|
29
|
-
|
31
|
+
year: {
|
32
|
+
EN: 'dd[itemprop="datePublished"]',
|
33
|
+
ES: 'dd[itemprop="datePublished"]'
|
30
34
|
},
|
31
|
-
|
32
|
-
|
33
|
-
|
35
|
+
duration: {
|
36
|
+
EN: 'dd[itemprop="duration"]',
|
37
|
+
ES: 'dd[itemprop="duration"]'
|
34
38
|
},
|
35
|
-
|
36
|
-
|
37
|
-
|
39
|
+
country: {
|
40
|
+
EN: '#country-img',
|
41
|
+
ES: '#country-img'
|
38
42
|
},
|
39
|
-
|
40
|
-
|
41
|
-
|
43
|
+
director: {
|
44
|
+
EN: 'a[itemprop="url"]',
|
45
|
+
ES: 'a[itemprop="url"]'
|
42
46
|
},
|
43
|
-
|
44
|
-
|
45
|
-
|
47
|
+
music: {
|
48
|
+
EN: 'dt:contains("Music")',
|
49
|
+
ES: 'dt:contains("Music")'
|
46
50
|
},
|
47
|
-
|
48
|
-
|
49
|
-
|
51
|
+
company: {
|
52
|
+
EN: 'dt:contains("Producer")',
|
53
|
+
ES: 'dt:contains("Productora")'
|
50
54
|
},
|
51
|
-
|
52
|
-
|
53
|
-
|
55
|
+
script: {
|
56
|
+
EN: 'dt:contains("Screenwriter")',
|
57
|
+
ES: 'dt:contains("Guion")'
|
54
58
|
},
|
55
|
-
|
56
|
-
|
57
|
-
|
59
|
+
photography: {
|
60
|
+
EN: 'dt:contains("Cinematography")',
|
61
|
+
ES: 'dt:contains("Fotografía")'
|
58
62
|
},
|
59
|
-
|
60
|
-
|
61
|
-
|
63
|
+
cast: {
|
64
|
+
EN: 'span[itemprop="actor"]',
|
65
|
+
ES: 'span[itemprop="actor"]'
|
62
66
|
},
|
63
|
-
|
64
|
-
|
65
|
-
|
67
|
+
cast_each: {
|
68
|
+
EN: 'span[itemprop="name"]',
|
69
|
+
ES: 'span[itemprop="name"]'
|
66
70
|
},
|
67
|
-
|
68
|
-
|
69
|
-
|
71
|
+
genre: {
|
72
|
+
EN: 'dt:contains("Genre")',
|
73
|
+
ES: 'dt:contains("Género")'
|
70
74
|
},
|
71
|
-
|
72
|
-
|
73
|
-
|
75
|
+
sinopsis: {
|
76
|
+
EN: 'dd[itemprop="description"]',
|
77
|
+
ES: 'dd[itemprop="description"]'
|
74
78
|
},
|
75
|
-
|
76
|
-
|
77
|
-
|
79
|
+
rating: {
|
80
|
+
EN: 'div[itemprop="ratingValue"]',
|
81
|
+
ES: 'div[itemprop="ratingValue"]'
|
78
82
|
},
|
79
|
-
|
80
|
-
|
81
|
-
|
83
|
+
poster: {
|
84
|
+
EN: 'img[itemprop="image"]',
|
85
|
+
ES: 'img[itemprop="image"]'
|
82
86
|
},
|
83
|
-
|
84
|
-
|
85
|
-
|
87
|
+
poster_big: {
|
88
|
+
EN: 'a[class="lightbox"]',
|
89
|
+
ES: 'a[class="lightbox"]'
|
86
90
|
}
|
87
91
|
|
88
92
|
}
|
89
93
|
end
|
94
|
+
# rubocop:enable Metrics/MethodLength
|
90
95
|
|
91
96
|
def self.tag(type)
|
92
97
|
lang = FilmAffinity.configuration.language.to_sym
|
@@ -1,6 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'json'
|
2
4
|
|
3
5
|
class JsonMovieParser
|
6
|
+
# rubocop:disable Metrics/MethodLength
|
4
7
|
def to_hash(movie)
|
5
8
|
{
|
6
9
|
'title' => movie.title,
|
@@ -15,9 +18,9 @@ class JsonMovieParser
|
|
15
18
|
'poster_big' => movie.poster_big
|
16
19
|
}
|
17
20
|
end
|
21
|
+
# rubocop:enable Metrics/MethodLength
|
18
22
|
|
19
23
|
def to_json(movie)
|
20
|
-
|
21
|
-
hash.to_json
|
24
|
+
to_hash(movie).to_json
|
22
25
|
end
|
23
26
|
end
|
@@ -1,18 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class JsonMoviesParser
|
2
4
|
def to_hashes(movies)
|
3
|
-
|
4
|
-
|
5
|
-
hash = {
|
5
|
+
movies.map do |movie|
|
6
|
+
{
|
6
7
|
'id' => movie.id,
|
7
8
|
'title' => movie.title
|
8
9
|
}
|
9
|
-
hashes << hash
|
10
10
|
end
|
11
|
-
hashes
|
12
11
|
end
|
13
12
|
|
14
13
|
def to_json(movies)
|
15
|
-
|
16
|
-
hashes.to_json
|
14
|
+
to_hashes(movies).to_json
|
17
15
|
end
|
18
16
|
end
|
data/lib/filmaffinity/movie.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module FilmAffinity
|
2
4
|
class Movie
|
3
|
-
attr_reader :id
|
5
|
+
attr_reader :id
|
6
|
+
|
4
7
|
def initialize(id, title = nil)
|
5
8
|
@id = id
|
6
|
-
@title = title
|
9
|
+
@title = title
|
7
10
|
@json_parser = JsonMovieParser.new
|
8
11
|
@poster_manager = PosterManager.new
|
9
12
|
end
|
@@ -13,117 +16,110 @@ module FilmAffinity
|
|
13
16
|
end
|
14
17
|
|
15
18
|
def generate_html
|
16
|
-
|
19
|
+
URI.parse(Constants.urls[:movie] % id).open
|
17
20
|
end
|
18
21
|
|
19
22
|
def title
|
20
23
|
@title ||= document_html.at(Constants.tag(:title)).content.strip
|
21
|
-
rescue
|
24
|
+
rescue StandardError
|
22
25
|
nil
|
23
26
|
end
|
24
27
|
|
25
28
|
def year
|
26
29
|
document_html.at(Constants.tag(:year)).content[/\d+/].to_i
|
27
|
-
rescue
|
30
|
+
rescue StandardError
|
28
31
|
nil
|
29
32
|
end
|
30
33
|
|
31
34
|
def duration
|
32
35
|
document_html.at(Constants.tag(:duration)).content[/\d+/].to_i
|
33
|
-
rescue
|
36
|
+
rescue StandardError
|
34
37
|
nil
|
35
38
|
end
|
36
39
|
|
37
40
|
def country
|
38
|
-
|
39
|
-
|
40
|
-
rescue
|
41
|
+
document_html.at(Constants.tag(:country)).next_sibling.content&.gsub(/\A[[:space:]]+|[[:space:]]+\z/, '')
|
42
|
+
rescue StandardError
|
41
43
|
nil
|
42
44
|
end
|
43
45
|
|
44
46
|
def director
|
45
|
-
|
46
|
-
|
47
|
-
rescue
|
47
|
+
document_html.at(Constants.tag(:director)).content&.strip
|
48
|
+
rescue StandardError
|
48
49
|
nil
|
49
50
|
end
|
50
51
|
|
51
52
|
def music
|
52
53
|
document_html.at(Constants.tag(:music)).next_sibling.next_sibling.content
|
53
|
-
rescue
|
54
|
+
rescue StandardError
|
54
55
|
nil
|
55
56
|
end
|
56
57
|
|
57
58
|
def company
|
58
59
|
document_html.at(Constants.tag(:company)).next_sibling.next_sibling.content
|
59
|
-
rescue
|
60
|
+
rescue StandardError
|
60
61
|
nil
|
61
62
|
end
|
62
63
|
|
63
64
|
def script
|
64
65
|
document_html.at(Constants.tag(:script)).next_sibling.next_sibling.content
|
65
|
-
rescue
|
66
|
+
rescue StandardError
|
66
67
|
nil
|
67
68
|
end
|
68
69
|
|
69
70
|
def photography
|
70
71
|
document_html.at(Constants.tag(:photography)).next_sibling.next_sibling.content
|
71
|
-
rescue
|
72
|
+
rescue StandardError
|
72
73
|
nil
|
73
74
|
end
|
74
75
|
|
75
76
|
def cast
|
76
|
-
|
77
|
-
|
78
|
-
node.each do |actor|
|
79
|
-
actors << actor.at(Constants.tag(:cast_each)).content.strip
|
77
|
+
document_html.search(Constants.tag(:cast)).map do |actor|
|
78
|
+
actor.at(Constants.tag(:cast_each)).content.strip
|
80
79
|
end
|
81
|
-
|
82
|
-
rescue
|
80
|
+
rescue StandardError
|
83
81
|
[]
|
84
82
|
end
|
85
83
|
|
86
84
|
def genres
|
87
|
-
genres = []
|
88
85
|
node = document_html.at(Constants.tag(:genre)).next_sibling.next_sibling
|
89
86
|
raw_genres = node.search('a')
|
90
|
-
raw_genres.
|
91
|
-
|
87
|
+
raw_genres.map do |raw_genre|
|
88
|
+
raw_genre.content.strip
|
92
89
|
end
|
93
|
-
|
94
|
-
rescue
|
90
|
+
rescue StandardError
|
95
91
|
[]
|
96
92
|
end
|
97
93
|
|
98
94
|
def sinopsis
|
99
95
|
document_html.at(Constants.tag(:sinopsis)).content
|
100
|
-
rescue
|
96
|
+
rescue StandardError
|
101
97
|
nil
|
102
98
|
end
|
103
99
|
|
104
100
|
def rating
|
105
101
|
raw_rating = document_html.at(Constants.tag(:rating)).content.strip
|
106
|
-
raw_rating
|
107
|
-
rescue
|
102
|
+
raw_rating&.tr(',', '.')&.to_f
|
103
|
+
rescue StandardError
|
108
104
|
nil
|
109
105
|
end
|
110
106
|
|
111
107
|
def poster
|
112
108
|
poster_url = document_html.at(Constants.tag(:poster))['src']
|
113
109
|
@poster_manager.load_poster(poster_url) if poster_url
|
114
|
-
rescue
|
110
|
+
rescue StandardError
|
115
111
|
nil
|
116
112
|
end
|
117
113
|
|
118
114
|
def poster_big
|
119
115
|
poster_url = document_html.at(Constants.tag(:poster_big))['href']
|
120
116
|
@poster_manager.load_poster(poster_url) if poster_url
|
121
|
-
rescue
|
117
|
+
rescue StandardError
|
122
118
|
nil
|
123
119
|
end
|
124
120
|
|
125
|
-
def to_json
|
126
|
-
@json_parser.to_json
|
121
|
+
def to_json(*_args)
|
122
|
+
@json_parser.to_json(self)
|
127
123
|
end
|
128
124
|
end
|
129
125
|
end
|
@@ -1,15 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'open-uri'
|
2
4
|
require 'imgur'
|
3
5
|
|
4
6
|
class PosterManager
|
5
7
|
def load_poster(posterurl)
|
6
8
|
return posterurl unless FilmAffinity.configuration.imgur_id
|
9
|
+
|
7
10
|
upload(posterurl, FilmAffinity.configuration.imgur_id)
|
8
11
|
end
|
9
12
|
|
10
13
|
def upload(posterurl, api_id)
|
11
14
|
imgur = Imgur.new(api_id)
|
12
|
-
@dir = __dir__ + '/' +
|
15
|
+
@dir = __dir__ + '/' + random_name + '.jpg'
|
13
16
|
save_img_locally(posterurl)
|
14
17
|
local_image = Imgur::LocalImage.new(@dir)
|
15
18
|
uploaded = imgur.upload(local_image)
|
@@ -18,14 +21,14 @@ class PosterManager
|
|
18
21
|
end
|
19
22
|
|
20
23
|
def save_img_locally(posterurl)
|
21
|
-
|
24
|
+
URI.parse(posterurl).open do |f|
|
22
25
|
File.open(@dir, 'wb') do |file|
|
23
26
|
file.puts f.read
|
24
27
|
end
|
25
28
|
end
|
26
29
|
end
|
27
30
|
|
28
|
-
def
|
29
|
-
(
|
31
|
+
def random_name
|
32
|
+
SecureRandom.urlsafe_base64(8)
|
30
33
|
end
|
31
34
|
end
|