class Enceladus::Account < Enceladus::ApiResource RESOURCE_ATTRIBUTES = [:id, :include_adult, :iso_3166_1, :iso_639_1, :name, :username, :session_id].map(&:freeze).freeze attr_accessor *RESOURCE_ATTRIBUTES # Responsible for authenticating TMDb users. # Authentication of users follows the workflow: https://www.themoviedb.org/documentation/api/sessions # This method hits the following api endpoints: # # - http://api.themoviedb.org/3/authentication/token/new # - http://api.themoviedb.org/3/authentication/token/validate_with_login # - http://api.themoviedb.org/3/authentication/session/new # - http://api.themoviedb.org/3/account # # Example: # # Enceladus::Account.new("bruna_ferraz", "dajhhd") # def initialize(username, password) self.username = username self.password = password start_authentication_workflow end # Adds movie to accounts favorite list. # Example: # # account = Enceladus::Account.new("bruna_ferraz", "dajhhd") # account.favorite_movie!(23444) # def favorite_movie!(movie_id) toggle_favorite_movie(movie_id, true) end # Removes movie to accounts favorite list. # Example: # # account = Enceladus::Account.new("bruna_ferraz", "dajhhd") # account.unfavorite_movie!(23444) # def unfavorite_movie!(movie_id) toggle_favorite_movie(movie_id, false) end # Adds movie to accounts watchlist. # Example: # # account = Enceladus::Account.new("bruna_ferraz", "dajhhd") # account.add_to_watchlist!(23444) # def add_to_watchlist!(movie_id) toggle_movie_watchlist(movie_id, true) end # Removes movie to accounts watchlist. # Example: # # account = Enceladus::Account.new("bruna_ferraz", "dajhhd") # account.remove_from_watchlist!(23444) # def remove_from_watchlist!(movie_id) toggle_movie_watchlist(movie_id, false) end # Return a list of account's favorite movies. # The returned movies are wrapped into a Enceladus::MovieCollection. # Example: # # account = Enceladus::Account.new("belinha", "dajhhd") # account.favorite_movies # def favorite_movies Enceladus::MovieCollection.new("account/#{id}/favorite/movies", { session_id: session_id }) if authenticated? end # Return a list of account's rated movies. # The returned movies are wrapped into a Enceladus::MovieCollection. # Example: # # account = Enceladus::Account.new("belinha", "dajhhd") # account.rated_movies # def rated_movies Enceladus::MovieCollection.new("account/#{id}/rated/movies", { session_id: session_id }) if authenticated? end # Return the account's watchlist # The returned movies are wrapped into a Enceladus::MovieCollection. # Example: # # account = Enceladus::Account.new("belinha", "hjgsss") # account.watchlist # def watchlist Enceladus::MovieCollection.new("account/#{id}/watchlist/movies", { session_id: session_id }) if authenticated? end private attr_accessor :request_token, :password def toggle_favorite_movie(movie_id, favorite) if authenticated? params = { session_id: session_id } form_data = { media_type: "movie", media_id: movie_id, favorite: favorite } Enceladus::Requester.post("account/#{id}/favorite", params, form_data) end end def toggle_movie_watchlist(movie_id, watchlist) if authenticated? params = { session_id: session_id } form_data = { media_type: "movie", media_id: movie_id, watchlist: watchlist } Enceladus::Requester.post("account/#{id}/watchlist", params, form_data) end end def authenticated? id && session_id end def start_authentication_workflow request_authentication_token authenticate open_session rebuild_single_resource(Enceladus::Requester.get("account", { session_id: session_id })) self.password = self.request_token = nil end def request_authentication_token token_info = Enceladus::Requester.get("authentication/token/new") self.request_token = token_info.request_token end def authenticate params = { request_token: request_token, username: username, password: password } Enceladus::Requester.get("authentication/token/validate_with_login", params).success end def open_session params = { request_token: request_token } self.session_id = Enceladus::Requester.get("authentication/session/new", params).session_id end end