movieDB 0.2.2 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Gem Version](https://badge.fury.io/rb/movieDB.png)](http://badge.fury.io/rb/movieDB)
|
4
|
-
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/movieDB.png)](http://badge.fury.io/rb/movieDB) [![Code Climate](https://codeclimate.com/github/keeperofthenecklace/movieDB.png)](https://codeclimate.com/github/keeperofthenecklace/movieDB) [![Build Status](https://secure.travis-ci.org/keeperofthenecklace/movieDB.png?branch=master)](http://travis-ci.org/keeperofthenecklace/movieDB)
|
4
|
+
[![Join the chat at https://gitter.im/keeperofthenecklace/movieDB](https://badges.gitter.im/Join%20Chat.svg)](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
|