movieDB 0.2.2 → 0.2.4
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 +15 -0
- data/.gitignore +1 -0
- data/.travis.yml +30 -0
- data/README.md +80 -74
- data/lib/movieDB.rb +225 -268
- data/lib/movieDB/base.rb +4 -5
- data/lib/movieDB/data_analysis.rb +59 -89
- data/lib/movieDB/data_export.rb +20 -21
- data/lib/movieDB/data_process.rb +1 -0
- data/lib/movieDB/genres/en.txt +0 -1
- data/lib/movieDB/person.rb +27 -28
- data/lib/movieDB/status_checker.rb +30 -32
- data/lib/movieDB/version.rb +1 -1
- data/movieDB.gemspec +1 -1
- data/spec/data_process_spec.rb +1 -1
- data/spec/movieDB_spec.rb +5 -7
- data/spec/person_spec.rb +14 -14
- metadata +6 -28
- data/npm-debug.log +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZjM4MWY0ZjliNThkY2U4YjcyZWNhMWY1NWIxZTY1NTJhYjkwZDllMw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZjVjMDg2M2ZkZGFlNjdmZGU5N2IxY2NkNGM0Yzk2YTc0MzU0ZDJlZg==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NzVhZTIwOGE1MTM4MDZiYmIxYTM1M2JkNzI0YjgwNTRlOGViMTI2NzNmZGQw
|
10
|
+
ZGMyZWRiYTU1MjQ3Zjg1N2NiNzA5ZDU5NzhkYjA0MWU5ZDVjMjRhZjIyNTRh
|
11
|
+
MmE5ZGNmMDFlMWQ3MjA4MWEwYzlhY2MyNjg0ZTRjMTE4MzVhNzg=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZjlhYjYxMzNiNDIwODU0NGE2NTllNWMzYzFiYTZkNzA0MjYxMzJkZDRmYjBi
|
14
|
+
NTAxMjFmN2ZmYmZlMmFlMDEzNTllZTFjZDM2Njk5YjkwYTM2ODQ1ZmI0MDE1
|
15
|
+
ZGQ1NjUwMDI5NjYwZmJmMGZjZDQyOWRlYWVlNmNmMDdkOTFhNTM=
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
before_script:
|
2
|
+
#- sh -e /etc/init.d/xvfb start
|
3
|
+
#- export DISPLAY=99:0
|
4
|
+
bundler_args: --without development production --quiet
|
5
|
+
env:
|
6
|
+
#- GEM DB=sqlite
|
7
|
+
#- GEM DB=mysql
|
8
|
+
#- GEM DB=postgres
|
9
|
+
before_install:
|
10
|
+
- cd $GEM; export BUNDLE_GEMFILE="`pwd`/Gemfile"
|
11
|
+
script: bundle exec rspec spec
|
12
|
+
|
13
|
+
matrix:
|
14
|
+
allow_failures:
|
15
|
+
- rvm: 1.9.7
|
16
|
+
#- rvm: jruby
|
17
|
+
#- rvm: rbx
|
18
|
+
#- rvm: ree
|
19
|
+
|
20
|
+
notifications:
|
21
|
+
email: kotn_ep1@hotmail.com
|
22
|
+
webhooks:
|
23
|
+
on_success: always
|
24
|
+
on_failure: always
|
25
|
+
|
26
|
+
rvm:
|
27
|
+
# 1.9.3
|
28
|
+
- 1.9.7
|
29
|
+
#- 2.0.0
|
30
|
+
#- 2.1.0
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
MovieDB - Movie Data Analysis Tool
|
2
2
|
|
3
|
-
[](http://badge.fury.io/rb/movieDB)
|
4
|
-
|
3
|
+
[](http://badge.fury.io/rb/movieDB) [](https://codeclimate.com/github/keeperofthenecklace/movieDB) [](http://travis-ci.org/keeperofthenecklace/movieDB)
|
4
|
+
[](https://gitter.im/keeperofthenecklace/movieDB?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
5
5
|
## Description
|
6
6
|
|
7
7
|
Although the name suggests a datastore gem, MovieDB is actually a ruby wrapper that inspects, cleans, transform and model imdb data and provides useful data analysis information, suggesting conclusion. The objective and usage is to provide a tool that can aide movie/film producers make statistical decisions based off archival imdb data.
|
@@ -21,11 +21,13 @@ Please follow the URL links for reading info.
|
|
21
21
|
* https://github.com/ahmetabdi/themoviedb
|
22
22
|
|
23
23
|
## Requirements
|
24
|
-
|
24
|
+
|
25
25
|
ruby 1.9.x
|
26
|
-
|
26
|
+
|
27
27
|
themoviedb api key
|
28
28
|
|
29
|
+
code formattted using TomDoc code documentation specification
|
30
|
+
|
29
31
|
## Installation
|
30
32
|
|
31
33
|
Add this line to your application's Gemfile:
|
@@ -45,16 +47,18 @@ Or install it yourself as:
|
|
45
47
|
$ irb
|
46
48
|
|
47
49
|
> require 'movieDB'
|
48
|
-
|
50
|
+
|
49
51
|
> require 'MovieDB/data_export'
|
50
|
-
|
52
|
+
|
51
53
|
> require 'themoviedb'
|
52
54
|
|
53
|
-
## Usage -
|
55
|
+
## Usage - Fetch Raw Movie Data From IMDb (3 Steps)
|
56
|
+
|
57
|
+
> MovieDB::Movie.new /* PRINTS OUT THE DEFAULT INITIALIZED VALUES */
|
54
58
|
|
55
59
|
> MovieDB::Movie.clear_data_store /* ONLY IF YOUR WANT TO EMPTY YOUR DATASTORE (ARRAY) */
|
56
|
-
|
57
|
-
> MovieDB::Movie.send(:get_multiple_imdb_movie_data, "
|
60
|
+
|
61
|
+
> MovieDB::Movie.send(:get_multiple_imdb_movie_data, "0369610", "3079380", "2395427")
|
58
62
|
|
59
63
|
/* YOU CAN ADD AS MANY IMDB UNIQUE NUMBERS. DO NOT EXCEED MAXIMUM REQUEST RATE.*/
|
60
64
|
|
@@ -64,9 +68,11 @@ Or install it yourself as:
|
|
64
68
|
|
65
69
|
The exported movie data is stored in your reports directory.
|
66
70
|
|
67
|
-
|
71
|
+
The file name is 'imdb_raw_data_' + today's date.
|
68
72
|
|
69
|
-
|
73
|
+
$ open /reports/imdb_raw_data_20150608.xls
|
74
|
+
|
75
|
+
## Usage - Analyze Raw Data and Generate Statistical Results (4 Steps)
|
70
76
|
|
71
77
|
$ irb
|
72
78
|
|
@@ -76,7 +82,7 @@ The exported movie data is stored in your reports directory.
|
|
76
82
|
|
77
83
|
> MovieDB::DataProcess.send(:basic_statistic, 'imdb_raw_data_20131216.xls')
|
78
84
|
|
79
|
-
### Exported - Analyzed Data
|
85
|
+
### Exported - Analyzed Data
|
80
86
|
|
81
87
|
The exported analyzed data is stored in your reports directory.
|
82
88
|
|
@@ -88,80 +94,80 @@ The exported analyzed data is stored in your reports directory.
|
|
88
94
|
|
89
95
|
`:GaussNewtonAlgorithm`
|
90
96
|
|
91
|
-
> Iteratively_Reweighted_Least_Squares
|
92
|
-
> Lack_Of_Fit_Sum_Of_Squares
|
93
|
-
> Least_Squares_Support_Vector_Machine
|
94
|
-
> Mean_Squared_Error
|
95
|
-
> Moving_Least_Sqares
|
96
|
-
> Non_Linear_Iterative_Partial_Least_Squares
|
97
|
-
> Non_Linear_Least_Squares
|
98
|
-
> Ordinary_Least_Squares
|
99
|
-
> Partial_Least_Squares_Regression
|
100
|
-
> Partition_Of_Sums_Of_Squares
|
101
|
-
> Proofs_Involving_Ordinary_Least_Squares
|
102
|
-
> Residual_Sum_Of_Squares
|
103
|
-
> Total_Least_Squares
|
104
|
-
> Total_Sum_Of_Squares
|
105
|
-
|
97
|
+
> Iteratively_Reweighted_Least_Squares
|
98
|
+
> Lack_Of_Fit_Sum_Of_Squares
|
99
|
+
> Least_Squares_Support_Vector_Machine
|
100
|
+
> Mean_Squared_Error
|
101
|
+
> Moving_Least_Sqares
|
102
|
+
> Non_Linear_Iterative_Partial_Least_Squares
|
103
|
+
> Non_Linear_Least_Squares
|
104
|
+
> Ordinary_Least_Squares
|
105
|
+
> Partial_Least_Squares_Regression
|
106
|
+
> Partition_Of_Sums_Of_Squares
|
107
|
+
> Proofs_Involving_Ordinary_Least_Squares
|
108
|
+
> Residual_Sum_Of_Squares
|
109
|
+
> Total_Least_Squares
|
110
|
+
> Total_Sum_Of_Squares
|
111
|
+
|
106
112
|
`:EstimationOfDensity`
|
107
113
|
|
108
|
-
> Cluster_Weighted_Modeling
|
109
|
-
> Density_Estimation
|
110
|
-
> Discretization_Of_Continuous_Features
|
111
|
-
> Mean_Integrated_Squared_Error
|
112
|
-
> Multivariate_Kernel_Density_Estimation
|
113
|
-
> Variable_Kernel_Density_Estimation
|
114
|
-
|
114
|
+
> Cluster_Weighted_Modeling
|
115
|
+
> Density_Estimation
|
116
|
+
> Discretization_Of_Continuous_Features
|
117
|
+
> Mean_Integrated_Squared_Error
|
118
|
+
> Multivariate_Kernel_Density_Estimation
|
119
|
+
> Variable_Kernel_Density_Estimation
|
120
|
+
|
115
121
|
`:ExploratoryDataAnalysis`
|
116
122
|
|
117
|
-
> Data_Reduction
|
118
|
-
> Table_Diagonalization
|
119
|
-
> Configural_Frequency_Analysis
|
120
|
-
> Median_Polish
|
121
|
-
> Stem_And_Leaf_Display
|
122
|
-
|
123
|
+
> Data_Reduction
|
124
|
+
> Table_Diagonalization
|
125
|
+
> Configural_Frequency_Analysis
|
126
|
+
> Median_Polish
|
127
|
+
> Stem_And_Leaf_Display
|
128
|
+
|
123
129
|
> Data_Mining
|
124
|
-
> Applied_DataMining
|
125
|
-
> Cluster_Analysis
|
126
|
-
> Dimension_Reduction
|
127
|
-
> Applied_DataMining
|
128
|
-
|
130
|
+
> Applied_DataMining
|
131
|
+
> Cluster_Analysis
|
132
|
+
> Dimension_Reduction
|
133
|
+
> Applied_DataMining
|
134
|
+
|
129
135
|
> RegressionAnalysis
|
130
|
-
> Choice_Modelling
|
131
|
-
|
132
|
-
> Generalized_Linear_Model
|
133
|
-
> Binomial_Regression
|
134
|
-
> Generalized_Additive_Model
|
135
|
-
> Linear_Probability_Model
|
136
|
-
> Poisson_Regression
|
137
|
-
> Zero_Inflated_Model
|
138
|
-
|
139
|
-
> Nonparametric_Regression
|
140
|
-
> Statistical_Outliers
|
141
|
-
> Regression_And_Curve_Fitting_Software
|
142
|
-
> Regression_Diagnostics
|
143
|
-
> Regression_Variable_Selection
|
144
|
-
> Regression_With_Time_Series_Structure
|
145
|
-
> Robust_Regression
|
146
|
-
> Choice_Modeling
|
147
|
-
|
136
|
+
> Choice_Modelling
|
137
|
+
|
138
|
+
> Generalized_Linear_Model
|
139
|
+
> Binomial_Regression
|
140
|
+
> Generalized_Additive_Model
|
141
|
+
> Linear_Probability_Model
|
142
|
+
> Poisson_Regression
|
143
|
+
> Zero_Inflated_Model
|
144
|
+
|
145
|
+
> Nonparametric_Regression
|
146
|
+
> Statistical_Outliers
|
147
|
+
> Regression_And_Curve_Fitting_Software
|
148
|
+
> Regression_Diagnostics
|
149
|
+
> Regression_Variable_Selection
|
150
|
+
> Regression_With_Time_Series_Structure
|
151
|
+
> Robust_Regression
|
152
|
+
> Choice_Modeling
|
153
|
+
|
148
154
|
> Resampling
|
149
|
-
> Bootstrapping_Population
|
150
|
-
|
155
|
+
> Bootstrapping_Population
|
156
|
+
|
151
157
|
> Sensitivity_Analysis
|
152
|
-
> Variance_Based_Sensitivity_Analysis
|
153
|
-
> Elementary_Effects_Method
|
154
|
-
> Experimental_Uncertainty_Analysis
|
155
|
-
> Fourier_Amplitude_Sensitivity_Testing
|
156
|
-
> Hyperparameter
|
157
|
-
|
158
|
+
> Variance_Based_Sensitivity_Analysis
|
159
|
+
> Elementary_Effects_Method
|
160
|
+
> Experimental_Uncertainty_Analysis
|
161
|
+
> Fourier_Amplitude_Sensitivity_Testing
|
162
|
+
> Hyperparameter
|
163
|
+
|
158
164
|
> Time_Series_Analysis
|
159
|
-
> Frequency_Deviation
|
165
|
+
> Frequency_Deviation
|
160
166
|
|
161
167
|
## Contact me
|
162
168
|
|
163
|
-
If you'd like to collaborate, please feel free to fork source code on github.
|
169
|
+
If you'd like to collaborate, please feel free to fork source code on github.
|
164
170
|
|
165
171
|
You can also contact me at albertmck@gmail.com
|
166
172
|
|
167
|
-
###### Copyright (c) 2013 Albert McKeever, released under MIT license
|
173
|
+
###### Copyright (c) 2013 Albert McKeever, released under MIT license
|
data/lib/movieDB.rb
CHANGED
@@ -1,293 +1,250 @@
|
|
1
1
|
require "rubygems"
|
2
|
-
require "time"
|
3
|
-
require "open-uri"
|
4
|
-
require "nokogiri"
|
5
|
-
require "zimdb"
|
6
|
-
require "themoviedb"
|
7
|
-
require "imdb"
|
8
|
-
require "spreadsheet"
|
2
|
+
require "time" # Time is an abstraction of dates and times.
|
3
|
+
require "open-uri" # is an easy-to-use wrapper for net/http, net/https and net/ftp.
|
4
|
+
require "nokogiri" # is an HTML, XML, SAX, and Reader parser.
|
5
|
+
require "zimdb" # Access movie information from IMDb via the API offered by http://www.imdbapi.com/
|
6
|
+
require "themoviedb" # Provides a simple, easy to use interface for the Movie Database API.
|
7
|
+
require "imdb" # Easily use Ruby or the command line to find information on IMDB.com.
|
8
|
+
require "spreadsheet" # A library designed to read and write Spreadsheet Documents.
|
9
9
|
require "MovieDB/base"
|
10
10
|
require "MovieDB/data_analysis"
|
11
11
|
require "MovieDB/secret"
|
12
|
-
|
12
|
+
|
13
|
+
unless defined? MovieDB::Movie
|
14
|
+
module MovieDB #:nodoc:
|
13
15
|
# Create a new movie record. The values are stored in the key-value data store.
|
14
16
|
#
|
15
17
|
# Default values are supplement during the instantiation of the class.
|
16
18
|
# Those values are overriden when you provide one.
|
17
19
|
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
self.send "#{attr}=", (attributes.has_key?(attr.to_sym) ? attributes[attr.to_sym] : self.class.const_get("DEFAULT_#{attr.upcase}"))
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
##
|
113
|
-
# Iterating through the block for title duplication.
|
114
|
-
# Return a true if the array is not nil.
|
115
|
-
# Absence of title duplications should yield an empty array.
|
20
|
+
# You can use it like this:
|
21
|
+
#
|
22
|
+
# movie = Movie.new()
|
23
|
+
# movie.title = "When Sally Met Harry"
|
24
|
+
#
|
25
|
+
# You can raise a MovieError like this:
|
26
|
+
#
|
27
|
+
# raise MovieError unless Movie.title_present?
|
28
|
+
class Movie < MovieDB::Base
|
29
|
+
include StatusChecker
|
30
|
+
|
31
|
+
extend MovieDB::Secret::Lock
|
32
|
+
|
33
|
+
const_set("MovieError", Class.new(StandardError))
|
34
|
+
|
35
|
+
attr_accessor :title,
|
36
|
+
:cast_members,
|
37
|
+
:cast_characters,
|
38
|
+
:cast_member_ids,
|
39
|
+
:cast_members_characters,
|
40
|
+
:trailer_url,
|
41
|
+
:director,
|
42
|
+
:writer,
|
43
|
+
:filming_locations,
|
44
|
+
:company,
|
45
|
+
:genres,
|
46
|
+
:languages,
|
47
|
+
:countries,
|
48
|
+
:length,
|
49
|
+
:plot,
|
50
|
+
:poster,
|
51
|
+
:rating,
|
52
|
+
:votes,
|
53
|
+
:mpaa_rating,
|
54
|
+
:tagline,
|
55
|
+
:year,
|
56
|
+
:release_date,
|
57
|
+
:worldwide_gross,
|
58
|
+
:released,
|
59
|
+
:unique_id,
|
60
|
+
:academy_award_nomination,
|
61
|
+
:academy_award_wins,
|
62
|
+
:golden_globe_nominations,
|
63
|
+
:golden_globe_wins,
|
64
|
+
:bafta_nomination,
|
65
|
+
:bafta_wins,
|
66
|
+
:film_release
|
67
|
+
|
68
|
+
DEFAULT_TITLE = "Method Missing 2: Rails Roars!"
|
69
|
+
DEFAULT_CAST_MEMBERS = ["David Black", "Paola Perotta", "Obie Fernandez", "David Chelimsky"]
|
70
|
+
DEFAULT_CAST_CHARACTERS = ["Developer", "Police Officer", "Hunter", "Hostage"]
|
71
|
+
DEFAULT_CAST_MEMBERS_CHARACTERS = ["David Black => Developer", "Paola Perotta => Police Officer",
|
72
|
+
"Obie Fernandez =>Hunter", "David Chelimsky =>Hostage"]
|
73
|
+
DEFAULT_CAST_MEMBER_IDS = ["nm3901234", "nm4901244", "nm5901235", "nm3601266"]
|
74
|
+
DEFAULT_TRAILER_URL = "http://imdb.com/video/screenplay/vi581042457/"
|
75
|
+
DEFAULT_DIRECTOR = "Yukihiro 'Matz' Matsumoto"
|
76
|
+
DEFAULT_WRITER = 'David Heinemeier Hansson'
|
77
|
+
DEFAULT_FILMING_LOCATIONS = ["Manhattan, New York, USA"]
|
78
|
+
DEFAULT_COMPANY = "Open Source Community Film Corporation"
|
79
|
+
DEFAULT_GENRES = ["Bromantic", "Syfy"]
|
80
|
+
DEFAULT_LANGUAGES = ["English", "German", "Italian"]
|
81
|
+
DEFAULT_COUNTRIES = ["USA", "Germany", "Italy"]
|
82
|
+
DEFAULT_LENGTH = 146
|
83
|
+
DEFAULT_PLOT = ["David Black, a ruby developer, tries to write his flagship ruby book 'The Well-Grounded Rubyist vol. 186' only to find out that Ruby 9.0.2 and Rails 16.0.3 release dates have been postponed"]
|
84
|
+
DEFAULT_POSTER = "http://ia.media-imdb.com/images/M/MV5BMTY@@.jpg"
|
85
|
+
DEFAULT_RATING = 9.9
|
86
|
+
DEFAULT_VOTES = 110636
|
87
|
+
DEFAULT_MPAA_RATING = "Rated R for dynamic OOD language usage and private methods access (certificate 33087)"
|
88
|
+
DEFAULT_TAGLINE = 'Only One MVC Will Rule Them All.'
|
89
|
+
DEFAULT_YEAR = 2013
|
90
|
+
DEFAULT_RELEASE_DATE = "11 October 2013 (USA)"
|
91
|
+
DEFAULT_WORLDWIDE_GROSS = "$124.6M" # Not provided by imdb api.
|
92
|
+
DEFAULT_UNIQUE_ID = @unique_id
|
93
|
+
DEFAULT_ACADEMY_AWARD_NOMINATION = 4
|
94
|
+
DEFAULT_ACADEMY_AWARD_WINS = 3
|
95
|
+
DEFAULT_GOLDEN_GLOBE_NOMINATIONS = 4
|
96
|
+
DEFAULT_GOLDEN_GLOBE_WINS = 2
|
97
|
+
DEFAULT_BAFTA_NOMINATION = 3
|
98
|
+
DEFAULT_BAFTA_WINS = 1
|
99
|
+
DEFAULT_FILM_RELEASE = ['theatrical', 'video', 'television', 'internet', 'print']
|
100
|
+
def initialize(attributes = {})
|
101
|
+
$IMDB_ATTRIBUTES_HEADERS = movie_attr = %w(title cast_members cast_characters cast_member_ids cast_members_characters
|
102
|
+
trailer_url director writer filming_locations company genres languages countries
|
103
|
+
length plot poster rating votes mpaa_rating tagline year release_date worldwide_gross unique_id
|
104
|
+
academy_award_nomination academy_award_wins golden_globe_nominations golden_globe_wins
|
105
|
+
bafta_nomination bafta_wins film_release)
|
106
|
+
|
107
|
+
movie_attr.each do |attr|
|
108
|
+
self.send("#{attr}=", (attributes.has_key?(attr.to_sym) ? attributes[attr.to_sym] : self.class.const_get("DEFAULT_#{attr.upcase}")))
|
109
|
+
end
|
116
110
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
111
|
+
end
|
112
|
+
|
113
|
+
# Iterating through the block for title duplication.
|
114
|
+
# Return true if the array is not nil.
|
115
|
+
# Absence of title duplications should yield an empty array.
|
116
|
+
def self.title_present?
|
117
|
+
titles = Movie.instance_eval { filter_movie_attr("title") }
|
118
|
+
@title_exist = titles.detect { |duplicates| titles.count(duplicates) > 1 }
|
119
|
+
!@title_exist.nil?
|
120
|
+
end
|
121
|
+
|
122
|
+
def unique_id
|
123
|
+
@unique_id ||= "#{Date.today}#{Array.new(9){rand(9)}.join}".gsub('-','')
|
124
|
+
end
|
125
|
+
|
126
|
+
class << self
|
127
|
+
# Get a single data from imdb database.
|
128
|
+
#
|
129
|
+
# TODO: This method should be deprecated in the next version release.
|
130
|
+
def get_imdb_movie_data(value)
|
131
|
+
@movie_data = Imdb::Movie.new(value)
|
132
|
+
return @movie_data
|
133
|
+
end
|
122
134
|
|
123
|
-
|
124
|
-
|
135
|
+
def global_movie_data_store
|
136
|
+
return $GLOBAL_MOVIE_DS
|
137
|
+
end
|
138
|
+
# You can add multiple Imdb ids like this:
|
139
|
+
#
|
140
|
+
# MovieDB::Movie.send(:get_multiple_imdb_movie_data, "2024544", "1800241")
|
141
|
+
#
|
142
|
+
# Example: You can also collect the title attribute:
|
143
|
+
#
|
144
|
+
# MovieDB::Movie.instance_eval{filter_movie_attr("title")}
|
145
|
+
def get_multiple_imdb_movie_data(*args)
|
146
|
+
if args.size == 1
|
147
|
+
puts "*" * 41
|
148
|
+
puts "* A minimum of 2 Imdb id's are required *"
|
149
|
+
puts "* To perform statistical data analysis *"
|
150
|
+
puts "* You only have ONE Imdb id entered *"
|
151
|
+
puts "*" * 41
|
125
152
|
end
|
126
153
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
#
|
133
|
-
#
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
154
|
+
args.each do |value|
|
155
|
+
get_imdb_movie_data(value)
|
156
|
+
@movie_DS ||=[]
|
157
|
+
movie_info = Movie.new
|
158
|
+
|
159
|
+
# Query themoviedb.org for film revenue.
|
160
|
+
# returns 0 if revenue record doesn't exist.
|
161
|
+
tmdb_arr = []
|
162
|
+
tmdb_key = MovieDB::Movie.key
|
163
|
+
Tmdb::Api.key(tmdb_key)
|
164
|
+
tmdb = Tmdb::Movie.find(@movie_data.title)
|
165
|
+
|
166
|
+
if tmdb.empty?
|
167
|
+
tmdb_data = Tmdb::Movie.new
|
168
|
+
tmdb_data.revenue = 0
|
169
|
+
else
|
170
|
+
tmdb.select { |t| tmdb_arr << t.id }
|
171
|
+
tmdb_id = tmdb_arr[0]
|
172
|
+
tmdb_data = Tmdb::Movie.detail(tmdb_id)
|
142
173
|
end
|
143
174
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
tmdb = Tmdb::Movie.find(@movie_data.title)
|
184
|
-
|
185
|
-
if tmdb.empty?
|
186
|
-
tmdb_data = Tmdb::Movie.new
|
187
|
-
tmdb_data.revenue = 0
|
188
|
-
else
|
189
|
-
tmdb.select { |t| tmdb_arr << t.id }
|
190
|
-
tmdb_id = tmdb_arr[0]
|
191
|
-
tmdb_data = Tmdb::Movie.detail(tmdb_id)
|
192
|
-
end
|
193
|
-
begin
|
194
|
-
movie_info.title = Array.new << @movie_data.title
|
195
|
-
movie_info.cast_members = @movie_data.cast_members.flatten
|
196
|
-
movie_info.cast_characters = @movie_data.cast_characters
|
197
|
-
movie_info.cast_member_ids = @movie_data.cast_member_ids
|
198
|
-
movie_info.cast_members_characters = @movie_data.cast_members_characters
|
199
|
-
movie_info.trailer_url = @movie_data.trailer_url.nil? ? 'No Trailer' : @movie_data.trailer_url
|
200
|
-
movie_info.director = @movie_data.director.flatten
|
201
|
-
movie_info.writer = Array.new << @zimdb_data.writer
|
202
|
-
movie_info.filming_locations = @movie_data.filming_locations.flatten.join(', ')
|
203
|
-
movie_info.company = Array.new << @movie_data.company
|
204
|
-
movie_info.genres = @movie_data.genres.flatten.join(' ').sub(' ' , ', ')
|
205
|
-
movie_info.languages = Array.new << @movie_data.languages.flatten.join(' ').sub(' ' , ', ')
|
206
|
-
movie_info.countries = Array.new << @movie_data.countries.flatten.join(' ').sub(' ' , ', ')
|
207
|
-
movie_info.length = Array.new << @movie_data.length
|
208
|
-
movie_info.plot = Array.new << @movie_data.plot
|
209
|
-
movie_info.poster = Array.new << @movie_data.poster
|
210
|
-
movie_info.rating = Array.new << @movie_data.rating
|
211
|
-
movie_info.votes = Array.new << @movie_data.votes
|
212
|
-
movie_info.mpaa_rating = Array.new << @movie_data.mpaa_rating == [nil] ? ["Not Rated"] : [@movie_data.mpaa_rating]
|
213
|
-
movie_info.tagline = Array.new << @movie_data.tagline
|
214
|
-
movie_info.year = Array.new << @movie_data.year
|
215
|
-
movie_info.release_date = Array.new << @movie_data.release_date
|
216
|
-
movie_info.worldwide_gross = Array.new << tmdb_data.revenue
|
217
|
-
movie_info.unique_id = @unique_id
|
218
|
-
|
219
|
-
##
|
220
|
-
# TODO: Write API to request data from AMPAS.
|
221
|
-
|
222
|
-
#movie_info.academy_award_nomination = academy_award_nomination
|
223
|
-
#movie_info.academy_award_wins = academy_award_wins
|
224
|
-
#movie_info.golden_globe_nominations = golden_globe_nominations
|
225
|
-
#movie_info.golden_globe_wins = golden_globe_wins
|
226
|
-
#movie_info.bafta_nomination = bafta_nomination
|
227
|
-
#movie_info.bafta_wins = bafta_wins
|
228
|
-
$GLOBAL_MOVIE_DS = @movie_DS << movie_info
|
229
|
-
rescue
|
230
|
-
raise ArgumentError, 'invalid imbd id'
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
return @movie_DS
|
235
|
-
|
236
|
-
##
|
237
|
-
#TODO: Include this for later data analysis computation
|
238
|
-
|
239
|
-
#if Movie.title_present?
|
240
|
-
#raise ArgumentError, "The title #{@title_exist} has already been taking"
|
241
|
-
#else
|
242
|
-
#return @movie_DS
|
243
|
-
#end
|
244
|
-
|
245
|
-
end
|
246
|
-
|
247
|
-
# Empty the data store
|
248
|
-
# Reset to nil
|
249
|
-
|
250
|
-
def clear_data_store
|
251
|
-
@movie_DS = []
|
252
|
-
return @movie_DS
|
175
|
+
begin
|
176
|
+
movie_info.title = Array.new << @movie_data.title
|
177
|
+
movie_info.cast_members = @movie_data.cast_members.flatten
|
178
|
+
movie_info.cast_characters = @movie_data.cast_characters
|
179
|
+
movie_info.cast_member_ids = @movie_data.cast_member_ids
|
180
|
+
movie_info.cast_members_characters = @movie_data.cast_members_characters
|
181
|
+
movie_info.trailer_url = @movie_data.trailer_url.nil? ? 'No Trailer' : @movie_data.trailer_url
|
182
|
+
movie_info.director = @movie_data.director.flatten
|
183
|
+
movie_info.writer = @movie_data.writers.flatten
|
184
|
+
movie_info.filming_locations = @movie_data.filming_locations.flatten.join(', ')
|
185
|
+
movie_info.company = Array.new << @movie_data.company
|
186
|
+
movie_info.genres = @movie_data.genres.flatten.join(' ').sub(' ' , ', ')
|
187
|
+
movie_info.languages = Array.new << @movie_data.languages.flatten.join(' ').sub(' ' , ', ')
|
188
|
+
movie_info.countries = Array.new << @movie_data.countries.flatten.join(' ').sub(' ' , ', ')
|
189
|
+
movie_info.length = Array.new << @movie_data.length
|
190
|
+
movie_info.plot = Array.new << @movie_data.plot
|
191
|
+
movie_info.poster = Array.new << @movie_data.poster
|
192
|
+
movie_info.rating = Array.new << @movie_data.rating
|
193
|
+
movie_info.votes = Array.new << @movie_data.votes
|
194
|
+
movie_info.mpaa_rating = Array.new << @movie_data.mpaa_rating == [nil] ? ["Not Rated"] : [@movie_data.mpaa_rating]
|
195
|
+
movie_info.tagline = Array.new << @movie_data.tagline
|
196
|
+
movie_info.year = Array.new << @movie_data.year
|
197
|
+
movie_info.release_date = Array.new << @movie_data.release_date
|
198
|
+
movie_info.worldwide_gross = Array.new << tmdb_data["revenue"]
|
199
|
+
movie_info.unique_id = @unique_id
|
200
|
+
|
201
|
+
# TODO: Write API to request additional data from AMPAS.
|
202
|
+
#
|
203
|
+
# Example: We can fetch the data like this:
|
204
|
+
#
|
205
|
+
# movie_info.academy_award_nomination = academy_award_nomination
|
206
|
+
# movie_info.academy_award_wins = academy_award_wins
|
207
|
+
# movie_info.golden_globe_nominations = golden_globe_nominations
|
208
|
+
# movie_info.golden_globe_wins = golden_globe_wins
|
209
|
+
# movie_info.bafta_nomination = bafta_nomination
|
210
|
+
# movie_info.bafta_wins = bafta_wins
|
211
|
+
$GLOBAL_MOVIE_DS = @movie_DS << movie_info
|
212
|
+
rescue
|
213
|
+
raise ArgumentError, 'invalid imbd id'
|
253
214
|
end
|
215
|
+
end
|
254
216
|
|
255
|
-
|
256
|
-
|
257
|
-
#
|
258
|
-
# Example.
|
259
|
-
# Movie.filter_movie_attr('cast_members') #=> ["Chris_Hemsworth", "Natalie_Portman"]
|
217
|
+
return @movie_DS
|
218
|
+
end
|
260
219
|
|
261
|
-
|
262
|
-
|
263
|
-
attr_sym = attr.to_sym
|
220
|
+
def clear_data_store
|
221
|
+
@movie_DS = []
|
264
222
|
|
265
|
-
|
266
|
-
|
267
|
-
attr_raw == ('languages' && 'title') ? filtered : filtered#.uniq
|
268
|
-
end
|
269
|
-
end
|
270
|
-
private_class_method :get_multiple_imdb_movie_data, :filter_movie_attr, :get_imdb_movie_data
|
223
|
+
return @movie_DS
|
224
|
+
end
|
271
225
|
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
226
|
+
# Filter the data store for the movie attributes. Return an array of the attributes.
|
227
|
+
#
|
228
|
+
# Example
|
229
|
+
#
|
230
|
+
# Movie.filter_movie_attr('cast_members') #=> ["Chris_Hemsworth", "Natalie_Portman"]
|
231
|
+
def filter_movie_attr(attr)
|
232
|
+
attr_raw = attr
|
233
|
+
attr_sym = attr.to_sym
|
234
|
+
|
235
|
+
raise ArgumentError, ("#{attr_sym} is not a valid attribute." if !attr_sym == :director && :cast_members)
|
236
|
+
filtered = @movie_DS.select{ |ds| ds.attr_title? }.map(&attr_sym)#.flatten
|
237
|
+
attr_raw == ('languages' && 'title') ? filtered : filtered#.uniq
|
238
|
+
end
|
239
|
+
end
|
276
240
|
|
277
|
-
|
278
|
-
# Use the double splat to capture auxillary arguments.
|
279
|
-
# Will use this feature in Ruby 2.0 upgrade.
|
280
|
-
# Currently, the software requirement is Ruby 1.9.x
|
281
|
-
#
|
282
|
-
# USAGE: capture(synopsis: "Last Vegas - Four geriatric friends vow to set Las Vegas Ablaze.")
|
241
|
+
private_class_method :get_multiple_imdb_movie_data, :filter_movie_attr, :get_imdb_movie_data
|
283
242
|
|
284
|
-
|
285
|
-
|
286
|
-
|
243
|
+
def attr_title
|
244
|
+
!@title.nil?
|
245
|
+
end
|
246
|
+
alias :attr_title? :attr_title
|
287
247
|
|
288
|
-
#def wrap(synopsis, before: "(", after: ")")
|
289
|
-
#"#{before}#{synopsis}#{after}"
|
290
|
-
#end
|
291
|
-
end
|
292
248
|
end
|
249
|
+
end
|
293
250
|
end
|