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.
Files changed (91) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ci.yml +34 -0
  3. data/.rubocop.yml +6 -3
  4. data/Gemfile +10 -2
  5. data/Gemfile.lock +50 -21
  6. data/README.md +3 -2
  7. data/Rakefile +2 -0
  8. data/filmaffinity.gemspec +25 -19
  9. data/lib/constants/constants.rb +52 -47
  10. data/lib/filmaffinity/configuration.rb +1 -0
  11. data/lib/filmaffinity/{json-movie-parser.rb → json_movie_parser.rb} +5 -2
  12. data/lib/filmaffinity/{json-movies-parser.rb → json_movies_parser.rb} +5 -7
  13. data/lib/filmaffinity/movie.rb +30 -34
  14. data/lib/filmaffinity/{poster-manager.rb → poster_manager.rb} +7 -4
  15. data/lib/filmaffinity/search.rb +17 -12
  16. data/lib/filmaffinity/top.rb +22 -14
  17. data/lib/filmaffinity/version.rb +5 -0
  18. data/lib/filmaffinity.rb +14 -11
  19. data/spec/filmaffinity/{json-movie-parser_spec.rb → json_movie_parser_spec.rb} +6 -3
  20. data/spec/filmaffinity/{json-movies-parser_spec.rb → json_movies_parser_spec.rb} +6 -3
  21. data/spec/filmaffinity/movie_spec.rb +65 -130
  22. data/spec/filmaffinity/search_spec.rb +13 -20
  23. data/spec/filmaffinity/top_spec.rb +65 -72
  24. data/spec/filmaffinity/version_spec.rb +15 -0
  25. data/spec/{filmaffinity/matchers/include-movie.rb → matchers/include_movie.rb} +3 -1
  26. data/spec/spec_helper.rb +8 -1
  27. data/spec/vcr/FilmAffinity_Movie/english_version/_cast/includes_the_passed_cast.yml +59 -0
  28. data/spec/vcr/FilmAffinity_Movie/english_version/_cast/returns_an_Array.yml +59 -0
  29. data/spec/vcr/FilmAffinity_Movie/english_version/_company/returns_Paramount_Pictures_Scott_Rudin_Productions_.yml +59 -0
  30. data/spec/vcr/FilmAffinity_Movie/english_version/_company/returns_a_String.yml +59 -0
  31. data/spec/vcr/FilmAffinity_Movie/english_version/_country/returns_United_States_.yml +59 -0
  32. data/spec/vcr/FilmAffinity_Movie/english_version/_country/returns_a_String.yml +59 -0
  33. data/spec/vcr/FilmAffinity_Movie/english_version/_director/returns_Peter_Weir_.yml +59 -0
  34. data/spec/vcr/FilmAffinity_Movie/english_version/_director/returns_a_String.yml +59 -0
  35. data/spec/vcr/FilmAffinity_Movie/english_version/_duration/returns_103.yml +59 -0
  36. data/spec/vcr/FilmAffinity_Movie/english_version/_duration/returns_an_Integer.yml +59 -0
  37. data/spec/vcr/FilmAffinity_Movie/english_version/_genres/includes_the_passed_genres.yml +59 -0
  38. data/spec/vcr/FilmAffinity_Movie/english_version/_genres/returns_an_Array.yml +59 -0
  39. data/spec/vcr/FilmAffinity_Movie/english_version/_poster/returns_a_String.yml +59 -0
  40. data/spec/vcr/FilmAffinity_Movie/english_version/_poster/returns_a_jpg_address.yml +59 -0
  41. data/spec/vcr/FilmAffinity_Movie/english_version/_rating/returns_an_Float.yml +59 -0
  42. data/spec/vcr/FilmAffinity_Movie/english_version/_script/returns_Andrew_Niccol_.yml +59 -0
  43. data/spec/vcr/FilmAffinity_Movie/english_version/_script/returns_a_String.yml +59 -0
  44. data/spec/vcr/FilmAffinity_Movie/english_version/_title/returns_an_valid_title_when_initializes_with_no_title.yml +59 -0
  45. data/spec/vcr/FilmAffinity_Movie/english_version/_year/returns_1998.yml +59 -0
  46. data/spec/vcr/FilmAffinity_Movie/english_version/_year/returns_an_Integer.yml +59 -0
  47. data/spec/vcr/FilmAffinity_Movie/spanish_version/_cast/includes_the_passed_cast.yml +59 -0
  48. data/spec/vcr/FilmAffinity_Movie/spanish_version/_cast/returns_an_Array.yml +59 -0
  49. data/spec/vcr/FilmAffinity_Movie/spanish_version/_company/returns_Paramount_Pictures_Scott_Rudin_Productions_.yml +59 -0
  50. data/spec/vcr/FilmAffinity_Movie/spanish_version/_company/returns_a_String.yml +59 -0
  51. data/spec/vcr/FilmAffinity_Movie/spanish_version/_country/returns_Estados_Unidos_.yml +59 -0
  52. data/spec/vcr/FilmAffinity_Movie/spanish_version/_country/returns_a_String.yml +59 -0
  53. data/spec/vcr/FilmAffinity_Movie/spanish_version/_director/returns_Peter_Weir_.yml +59 -0
  54. data/spec/vcr/FilmAffinity_Movie/spanish_version/_director/returns_a_String.yml +59 -0
  55. data/spec/vcr/FilmAffinity_Movie/spanish_version/_duration/returns_103.yml +59 -0
  56. data/spec/vcr/FilmAffinity_Movie/spanish_version/_duration/returns_an_Integer.yml +59 -0
  57. data/spec/vcr/FilmAffinity_Movie/spanish_version/_genres/includes_the_passed_genres.yml +59 -0
  58. data/spec/vcr/FilmAffinity_Movie/spanish_version/_genres/returns_an_Array.yml +59 -0
  59. data/spec/vcr/FilmAffinity_Movie/spanish_version/_poster/returns_a_String.yml +59 -0
  60. data/spec/vcr/FilmAffinity_Movie/spanish_version/_poster/returns_a_jpg_address.yml +59 -0
  61. data/spec/vcr/FilmAffinity_Movie/spanish_version/_rating/returns_an_Float.yml +59 -0
  62. data/spec/vcr/FilmAffinity_Movie/spanish_version/_script/returns_Andrew_Niccol_.yml +59 -0
  63. data/spec/vcr/FilmAffinity_Movie/spanish_version/_script/returns_a_String.yml +59 -0
  64. data/spec/vcr/FilmAffinity_Movie/spanish_version/_title/returns_an_valid_title_when_initializes_with_no_title.yml +59 -0
  65. data/spec/vcr/FilmAffinity_Movie/spanish_version/_year/returns_1998.yml +59 -0
  66. data/spec/vcr/FilmAffinity_Movie/spanish_version/_year/returns_an_Integer.yml +59 -0
  67. data/spec/vcr/FilmAffinity_Search/_movies/includes_the_The_Truman_Show_.yml +63 -0
  68. data/spec/vcr/FilmAffinity_Search/_movies/includes_the_Truman_Show_.yml +63 -0
  69. data/spec/vcr/FilmAffinity_Search/_movies/returns_FilmAffinity_Movie_objects_only.yml +63 -0
  70. data/spec/vcr/FilmAffinity_Search/_movies/returns_an_array.yml +63 -0
  71. data/spec/vcr/FilmAffinity_Search/_parse_movie/parses_the_id.yml +114 -0
  72. data/spec/vcr/FilmAffinity_Search/_parse_movie/parses_the_title.yml +114 -0
  73. data/spec/vcr/FilmAffinity_Top/_movies/no_options/includes_El_Padrino_.yml +63 -0
  74. data/spec/vcr/FilmAffinity_Top/_movies/no_options/includes_The_Godfather_.yml +63 -0
  75. data/spec/vcr/FilmAffinity_Top/_movies/no_options/returns_30_movies.yml +63 -0
  76. data/spec/vcr/FilmAffinity_Top/_movies/no_options/returns_FilmAffinity_Movie_objects_only.yml +63 -0
  77. data/spec/vcr/FilmAffinity_Top/_movies/no_options/returns_an_array.yml +63 -0
  78. data/spec/vcr/FilmAffinity_Top/_movies/with_options/only_with_limit/set_to_10/returns_10_movies.yml +63 -0
  79. data/spec/vcr/FilmAffinity_Top/_movies/with_options/only_with_limit/set_to_132/returns_132_movies.yml +303 -0
  80. 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
  81. data/spec/vcr/FilmAffinity_Top/_movies/with_options/only_with_limit/set_to_60/includes_American_History_X_.yml +123 -0
  82. data/spec/vcr/FilmAffinity_Top/_movies/with_options/only_with_limit/set_to_60/returns_60_movies.yml +123 -0
  83. data/spec/vcr/FilmAffinity_Top/_movies/with_options/with_genre_BE_and_country_code_DE_/includes_Generation_War_TV_Miniseries_.yml +125 -0
  84. 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
  85. data/spec/vcr/FilmAffinity_Top/_movies/with_options/with_genre_BE_and_country_code_DE_/returns_FilmAffinity_Movie_objects_only.yml +125 -0
  86. data/spec/vcr/FilmAffinity_Top/_movies/with_options/with_genre_BE_and_country_code_DE_/returns_an_array.yml +125 -0
  87. data/spec/vcr/JsonMovieParser/_to_hash/returns_the_right_director_for_the_given_movie.yml +59 -0
  88. data/spec/vcr/JsonMoviesParser/_to_hashes/returns_some_valid_ids_for_a_given_search.yml +63 -0
  89. metadata +162 -31
  90. data/.rubocop_todo.yml +0 -48
  91. data/.travis.yml +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 84f126709ab4e3d029bd5d44d1a1cbdd4489f29d
4
- data.tar.gz: d052a091f96b336367eced41ffe2f09f4b94cf3a
2
+ SHA256:
3
+ metadata.gz: a9088f75d64b8f2421c88d12ac936cfa80c90a6bd5e42fae80fdf3dfdd47f1d4
4
+ data.tar.gz: a0156abae8630d24c0b287050e22d3d7040f3b02267ae883bbb414cff37cc1cb
5
5
  SHA512:
6
- metadata.gz: 612703b5987c9f95e314f70e78a323cd73fd9b7c131cda3418b4085b1bf6a2175c398e49b6d661494c86667fe72f9639cdfa4438a9a4bfe666aac2450daebb48
7
- data.tar.gz: d7508c69357d275ba26a3d85eb35817976cddbd96925c0820e151943d93134eb8c36d69539996e40390052d1cfe9c951dd278b4e3c44c9e05d0d088c33e71b62
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
@@ -1,4 +1,7 @@
1
- inherit_from: .rubocop_todo.yml
1
+ AllCops:
2
+ TargetRubyVersion: 2.5
3
+ Exclude:
4
+ - 'spec/**/*'
2
5
 
3
- # Style/FileName:
4
- # Enabled: false
6
+ Documentation:
7
+ Enabled: false
data/Gemfile CHANGED
@@ -1,3 +1,11 @@
1
- source 'https://rubygems.org/'
2
- gem 'pry-nav', group: [:development, :test]
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
3
5
  gemspec
6
+
7
+ group :test do
8
+ gem 'rubocop'
9
+ gem 'vcr'
10
+ gem 'webmock'
11
+ end
data/Gemfile.lock CHANGED
@@ -1,33 +1,43 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- filmaffinity (1.1.1)
4
+ filmaffinity (1.1.2)
5
5
  imgur-api (~> 0)
6
- json (~> 1.8)
7
- nokogiri (~> 1.6)
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
- coderay (1.1.1)
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
- httparty (0.14.0)
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 (1.8.6)
19
- method_source (0.8.2)
20
- mini_portile2 (2.1.0)
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.7.1)
23
- mini_portile2 (~> 2.1.0)
24
- pry (0.10.3)
25
- coderay (~> 1.1.0)
26
- method_source (~> 0.8.1)
27
- slop (~> 3.4)
28
- pry-nav (0.2.4)
29
- pry (>= 0.9.10, < 0.11.0)
30
- rake (10.4.2)
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
- slop (3.6.0)
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
- pry-nav
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.13.6
85
+ 2.1.4
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
- # FilmAffinity Scraper Gem
2
- [![Build Status](https://travis-ci.org/davidsantosmerino/filmaffinity-gem.png?branch=master)](https://travis-ci.org/davidsantosmerino/filmaffinity-gem)
1
+ # FilmAffinity Gem
2
+
3
+ [![Build Status](https://github.com/dsantosmerino/filmaffinity-gem/workflows/CI/badge.svg)](https://github.com/dsantosmerino/filmaffinity-gem/actions)
3
4
  [![Gem Version](https://badge.fury.io/rb/filmaffinity.svg)](http://badge.fury.io/rb/filmaffinity)
4
5
 
5
6
  ## Description
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rspec/core/rake_task'
2
4
 
3
5
  RSpec::Core::RakeTask.new do |task|
data/filmaffinity.gemspec CHANGED
@@ -1,20 +1,26 @@
1
- Gem::Specification.new do |s|
2
- s.name = 'filmaffinity'
3
- s.version = '1.1.2'
4
- s.date = '2017-10-09'
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 = 'dsantosmerino@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 = 'https://github.com/davidsantosmerino/filmaffinity-gem'
14
- s.license = 'MIT'
15
- s.add_dependency 'nokogiri', ' ~> 1.6'
16
- s.add_dependency 'json', ' ~> 1.8'
17
- s.add_dependency 'imgur-api', '~> 0'
18
- s.add_development_dependency 'rake', '~> 10.0'
19
- s.add_development_dependency 'rspec', '~> 3.3'
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
@@ -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: { EN: '#main-title span',
25
- ES: '#main-title span'
27
+ title: {
28
+ EN: '#main-title span',
29
+ ES: '#main-title span'
26
30
  },
27
-
28
- year: { EN: 'dd[itemprop="datePublished"]',
29
- ES: 'dd[itemprop="datePublished"]'
31
+ year: {
32
+ EN: 'dd[itemprop="datePublished"]',
33
+ ES: 'dd[itemprop="datePublished"]'
30
34
  },
31
-
32
- duration: { EN: 'dd[itemprop="duration"]',
33
- ES: 'dd[itemprop="duration"]'
35
+ duration: {
36
+ EN: 'dd[itemprop="duration"]',
37
+ ES: 'dd[itemprop="duration"]'
34
38
  },
35
-
36
- country: { EN: '#country-img',
37
- ES: '#country-img'
39
+ country: {
40
+ EN: '#country-img',
41
+ ES: '#country-img'
38
42
  },
39
-
40
- director: { EN: 'a[itemprop="url"]',
41
- ES: 'a[itemprop="url"]'
43
+ director: {
44
+ EN: 'a[itemprop="url"]',
45
+ ES: 'a[itemprop="url"]'
42
46
  },
43
-
44
- music: { EN: 'dt:contains("Music")',
45
- ES: 'dt:contains("Music")'
47
+ music: {
48
+ EN: 'dt:contains("Music")',
49
+ ES: 'dt:contains("Music")'
46
50
  },
47
-
48
- company: { EN: 'dt:contains("Producer")',
49
- ES: 'dt:contains("Productora")'
51
+ company: {
52
+ EN: 'dt:contains("Producer")',
53
+ ES: 'dt:contains("Productora")'
50
54
  },
51
-
52
- script: { EN: 'dt:contains("Screenwriter")',
53
- ES: 'dt:contains("Guion")'
55
+ script: {
56
+ EN: 'dt:contains("Screenwriter")',
57
+ ES: 'dt:contains("Guion")'
54
58
  },
55
-
56
- photography: { EN: 'dt:contains("Cinematography")',
57
- ES: 'dt:contains("Fotografía")'
59
+ photography: {
60
+ EN: 'dt:contains("Cinematography")',
61
+ ES: 'dt:contains("Fotografía")'
58
62
  },
59
-
60
- cast: { EN: 'span[itemprop="actor"]',
61
- ES: 'span[itemprop="actor"]'
63
+ cast: {
64
+ EN: 'span[itemprop="actor"]',
65
+ ES: 'span[itemprop="actor"]'
62
66
  },
63
-
64
- cast_each: { EN: 'span[itemprop="name"]',
65
- ES: 'span[itemprop="name"]'
67
+ cast_each: {
68
+ EN: 'span[itemprop="name"]',
69
+ ES: 'span[itemprop="name"]'
66
70
  },
67
-
68
- genre: { EN: 'dt:contains("Genre")',
69
- ES: 'dt:contains("Género")'
71
+ genre: {
72
+ EN: 'dt:contains("Genre")',
73
+ ES: 'dt:contains("Género")'
70
74
  },
71
-
72
- sinopsis: { EN: 'dd[itemprop="description"]',
73
- ES: 'dd[itemprop="description"]'
75
+ sinopsis: {
76
+ EN: 'dd[itemprop="description"]',
77
+ ES: 'dd[itemprop="description"]'
74
78
  },
75
-
76
- rating: { EN: 'div[itemprop="ratingValue"]',
77
- ES: 'div[itemprop="ratingValue"]'
79
+ rating: {
80
+ EN: 'div[itemprop="ratingValue"]',
81
+ ES: 'div[itemprop="ratingValue"]'
78
82
  },
79
-
80
- poster: { EN: 'img[itemprop="image"]',
81
- ES: 'img[itemprop="image"]'
83
+ poster: {
84
+ EN: 'img[itemprop="image"]',
85
+ ES: 'img[itemprop="image"]'
82
86
  },
83
-
84
- poster_big: { EN: 'a[class="lightbox"]',
85
- ES: 'a[class="lightbox"]'
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,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Configuration
3
4
  attr_accessor :imgur_id, :language
@@ -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
- hash = to_hash movie
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
- hashes = []
4
- movies.each do |movie|
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
- hashes = to_hashes movies
16
- hashes.to_json
14
+ to_hashes(movies).to_json
17
15
  end
18
16
  end
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module FilmAffinity
2
4
  class Movie
3
- attr_reader :id, :title
5
+ attr_reader :id
6
+
4
7
  def initialize(id, title = nil)
5
8
  @id = id
6
- @title = title if 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
- open(Constants.urls[:movie] % id)
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
- raw_country = document_html.at(Constants.tag(:country)).next_sibling.content
39
- raw_country.gsub(/\A[[:space:]]+|[[:space:]]+\z/, '') if raw_country
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
- raw_director = document_html.at(Constants.tag(:director)).content
46
- raw_director.strip if raw_director
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
- actors = []
77
- node = document_html.search(Constants.tag(:cast))
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
- actors
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.each do |raw_genre|
91
- genres << raw_genre.content.strip
87
+ raw_genres.map do |raw_genre|
88
+ raw_genre.content.strip
92
89
  end
93
- genres
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.tr(',', '.').to_f if 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 self
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__ + '/' + construct_name + '.jpg'
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
- open(posterurl) do |f|
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 construct_name
29
- (0...8).map { (65 + rand(26)).chr }.join
31
+ def random_name
32
+ SecureRandom.urlsafe_base64(8)
30
33
  end
31
34
  end