シチュエーション別に選べる！NetflixとHuluの【ドラマ】【アニメ】ランダムチョイスアプリを作ってみた！

## サービス名
[サブスクルーレット](https://subsc-roulette.herokuapp.com/)

## サービス概要
・Netflix、Huluのどちらかを選択、更にシチュエーション（テンション上げたい、チルしたい、ハラハラしたい）を選択し、その中からランダムでドラマを選んでくれるアプリ。
## ターゲット
・Netflix、Huluなどのサブスクを使用している人で、次に観るものが決まっていない、または、決めるのが面倒な人向けのサービスとなっております。
## なぜこのサービスを作ったのか？

今回このサービスを作ったのは、私は、仕事終わりや休日にサブスクリプションサービスを利用してドラマやアニメをよく観ます。しかし、次に何を観るかを選ぶのは面倒で、選択肢が多すぎます。また、私がドラマやアニメを選ぶ基準は、基本的にポスター画像が「いい感じ」かどうかです。そこで、ランダムにドラマやアニメが表示され、ポスター画像やタイトル、概要で「いい感じ」のものが出てきたら、そのまま視聴することができるサービスを作成しました。選択肢から迷わず、気楽にサブスクリプションを楽しめるようになりました。
## サービス詳細
### ランダムで、ドラマ、TV番組を表示
  
①ユーザーは、NetflixかHuluか選択する。
<img width="1440" alt="スクリーンショット 2022-10-27 21 26 49" src="https://user-images.githubusercontent.com/87309077/198302278-bdec9f23-f64e-4b77-8f4b-955d03471afc.png">

②次に、シチュエーションを選択する。『テンション上げたい』、『チルした』、『ハラハラしたい』。
<img width="1440" alt="スクリーンショット 2022-10-29 16 52 02" src="https://user-images.githubusercontent.com/87309077/198820451-bcf9c3b7-d023-44e2-b44f-b6e07b73b66c.png">

③シチュエーションを選択したら、ランダムでそのシチュエーションに合ったドラマが出てくる。
<img width="1440" alt="スクリーンショット 2022-10-27 21 34 31" src="https://user-images.githubusercontent.com/87309077/198302794-c59bb6fa-3edc-404c-947f-2f08167d2e5f.png">


④ユーザー登録者は、気になる機能を使ってランダムで出てきたドラマを保存することが出来る。
<img width="1440" alt="スクリーンショット 2022-10-27 21 34 43" src="https://user-images.githubusercontent.com/87309077/198302946-30fe9929-e419-4aad-89f7-f96084057297.png">

※ゲストユーザーは気になるボタンは表示されません。
<img width="1440" alt="スクリーンショット 2022-10-28 0 37 00" src="https://user-images.githubusercontent.com/87309077/198334993-48983af0-95ea-4b65-bdc8-dc1b034249d3.png">


### ユーザー画面から気になるを表示
![ポートフォリオ](https://user-images.githubusercontent.com/87309077/198318505-c07d2576-3d02-42b8-b7b3-780131ad3ede.gif)

### コメント機能
<img width="1440" alt="スクリーンショット 2023-04-04 2 48 33" src="https://user-images.githubusercontent.com/87309077/229588922-02ee33ec-9be5-467e-8498-611f233e2154.png">

## 機能一覧

・ユーザー登録機能

・ランダムでドラマを表示する機能

・気になる機能（ランダムで選択された映画の画面に『気になる』ボタンがあ　りユーザー画面で『気になる一覧』で確認できるようにできる）

・コメント機能

## ER図

<img width="828" alt="スクリーンショット 2023-04-04 3 11 28" src="https://user-images.githubusercontent.com/87309077/229592211-874a8232-b849-4021-9016-fa8a4a0cc1c7.png">

## 力を入れたポイント
・[The Movie Database (TMDb)](https://www.themoviedb.org/)から取得する情報を常に最新にしておきたかったので、[【動画付き】外部APIに依存するRailsアプリケーションの設計とテストの書き方](https://qiita.com/jnchito/items/2a168b9083bc911981fa)の記事を参考に、DBにデータが保存されているのではなく、外部APIから取得したデータをあたかもDBから取得したデータのように扱うRailsアプリケーションを作りました。

### ①ドラマ、アニメをランダムに表示する機能

```ruby
def all(params = {})
      provider_id = params[:provider_id]
      genre_id = params[:genre_id]
      provider = URI.encode_www_form({with_networks: provider_id})
      genre = URI.encode_www_form({with_genres: genre_id})
      tmdb = URI.parse("https://api.themoviedb.org/3/discover/tv?api_key=#{ENV['API_KEY']}&language=ja-JP&#{provider}&#{genre}")
      response = Net::HTTP.get(tmdb)
      tmdb_list = JSON.parse(response)
      uri = URI.parse("https://api.themoviedb.org/3/discover/tv?api_key=#{ENV['API_KEY']}&language=ja-JP&#{provider}&#{genre}&page=#{rand(tmdb_list['total_pages'])+1}")
      json = Net::HTTP.get(uri)
      data_list = JSON.parse(json)
      movie = data_list["results"]
      movie.map do |data|
        Movie.new(data)
      end
    end
```

上記のコードは、TMDBという映画データベースのAPIを利用して、指定された条件に基づいてドラマ、アニメを検索し、ランダムに1つのドラマ、アニメを取得するためのメソッドです。

引数としてprovider_idとgenre_idが指定されます。provider_idはプロバイダ（NetflixやHuluなど）のIDを、genre_idはジャンル（ロマンス、ホラーなど）のIDを指定します。それぞれ、URIエンコードされてAPIリクエストのクエリパラメータに含まれます。

まず、provider_idとgenre_idをもとに、指定された条件に合致するドラマ、アニメのリストを取得します。取得されたリストは、ランダムなページ番号を指定して、ランダムに1つのドラマ、アニメを取得するためのURIを作成します。

次に、ランダムに選択されたドラマ、アニメのデータを取得し、そのデータをMovieクラスのインスタンスとして配列に格納して返します。

### ②「気になる」機能

```ruby
def like(params = {})
  user_id = params[:user_id]
  likes = Like.where(user_id: user_id).order(created_at: :desc).pluck(:movie_id)
  @likeslist = []
  likes.map do |id|
  uri = URI.parse("https://api.themoviedb.org/3/tv/#{id}?api_key=#{ENV['API_KEY']}&language=ja-JP")
  json = Net::HTTP.get(uri)
  result = JSON.parse(json)
  likeslist = result
  @likeslist += [likeslist]
  end
  list = @likeslist
  list.map do |list|
    Movie.new(list)
  end
end
```

上記のコードは、指定されたユーザーが「いいね」したドラマ、アニメのリストを取得し、その情報をもとにMovieオブジェクトのリストを生成するためのメソッドです。

引数としてuser_idが指定され、Likeモデルからuser_idが一致するレコードを取得し、作成日時の新しい順にソートされたmovie_idの配列を取得します。

その後、movie_idをもとに、TMDB APIからTVドラマの情報を取得し、それぞれの情報をlikeslistに格納します。最後に、likeslistを@likeslistに追加し、@likeslistの要素数分、Movieオブジェクトを生成してリストに格納し、返します。

### ③「気になる」の詳細ページ

```ruby
def like_movies(params = {})
  movie_id = params[:movie_id].to_i
  uri = URI.parse("https://api.themoviedb.org/3/tv/#{movie_id}?api_key=#{ENV['API_KEY']}&language=ja-JP")
  json = Net::HTTP.get(uri)
  result = JSON.parse(json)
  movie = [result]
  movie.map do |data|
    Movie.new(data)
  end
end
```

上記のコードは、指定されたmovie_idに対応するドラマアニメの情報をTMDB APIから取得し、それをもとにMovieオブジェクトを生成するためのメソッドです。

引数としてmovie_idが指定され、それをもとに、TMDB APIからドラマアニメの情報を取得します。取得したJSONデータをパースし、Movieオブジェクトに変換してリストに格納します。最後に、リストを返します。