作っているアプリ
YouTubeのURLを投稿してそれを埋め込み動画として表示し、
YouTubeのプレイリストをサイト上で自作できるようにするアプリをRailsで作っています。
仕様・技術・環境・Gemなど
Ruby '2.6.3'
Rails '5.2.4.1'
使用しているdb: Docker経由でのPostgreSQL
https://qiita.com/Kairi_Yasunnde/items/8e931a4670549ba8237e
https://qiita.com/yuichisan65/items/9356a2822fb37e51b3b4
これらの記事を参考にして動画を投稿しindexページでの一覧表示や
showページで単独で表示させることまでは出来ているのですが、
ここから進んで投稿した動画を組み合わせて
動画を連続再生させる方法が無いか模索しているところです。
プレイリストに関しては動画投稿のためのモデルと
それらに設定しているタグのモデルをリレーションで繋ぐことで管理しています。
登録されたタグをプルダウンメニューで一覧画面に表示し、
そこから選択することで登録されたタグを呼び出してプレイリストのように
動画の一覧を表示出来るようにしています。
動画の連続再生の方法としては
YouTubeのiframe Player APIの中にcuePlaylistというものがあり
このコードの中にYouTubeの末尾の11桁を配列として列挙すれば
擬似的にプレイリストが作れ、連続再生も可能であるということまでは分かりました。
Js
1function onPlayerReady(event) { 2 player.cuePlaylist([ 3 // このようにYouTubeのURLの末尾11桁を配列として列挙するだけでプレイリストを作ることが出来る 4 'BxqYUbNR-c0', 5 '0xSiBpUdW4E' 6 ] 7 ); 8 }
ただしこのやり方だとindexページに手動であらかじめ列記された分しか再生出来ず
htmlのフォーム上から投稿され、それをDBに登録したものを呼び出して再生する、
といったことが出来ません。
Js
1function onPlayerReady(event) { 2 player.cuePlaylist([ 3 '<%= movie.youtube_url %>' 4 ] 5 ); 6 }
現状では上記のようにとりあえず動画を表示させるために一時的に
erb
1<% movie.youtube_url %>
このコードを挿入しているのですが、これだけではindex.html.erb
で表示される最初の動画1つだけを延々とループさせることしか出来ません
分からずに困っている点
PostgreSQLに登録したYouTubeの末尾11桁の値をDBのカラムから
JavaScriptに渡してそれをindexに登録した動画の数分まで配列の中で
JavaScriptでループをさせれば実現出来そうだなと思ったのですが、
JavaScriptの勉強があまり出来ておらず実際のコードの書き方をどのようにすれば良いのか
分からない状態で困っています。
実際のコード
該当しそうなコードだけを列挙していますが、
アドバイスをいただく際に不足していそうなコードがあれば指摘していただければ
追記したします。
erb
1<!-- app/views/movies/index.html.erb --> 2 3<p id="notice"><%= notice %></p> 4 5<h1>動画一覧</h1> 6<%= form_tag movies_path, method: :get, class: 'boards__searchForm' do %> 7<%= select_tag :playlist_id, 8 options_from_collection_for_select(Playlist.all, :id, :playlist_name, params[:playlist_id]), 9 { 10 prompt: 'プレイリストをタグで絞り込み検索', 11 onchange: 'submit(this.form);' 12 } 13 %> 14<% end %> 15<br> 16<%= paginate @movies %> 17<div class="container-fluid"> 18 <div class="row"> 19 <% @movies.each do |movie| %> 20 <div class="col-md-6"> 21 <div> 22 <%= movie.title %> 23 <div id="player"> 24 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 25 <script> 26 var tag = document.createElement('script'); 27 tag.src = "https://www.youtube.com/iframe_api"; 28 var firstScriptTag = document.getElementsByTagName('script')[0]; 29 firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); 30 31 var player; 32 function onYouTubeIframeAPIReady() { 33 player = new YT.Player('player', { 34 height: '315', 35 width: '560', 36 events: { 37 'onReady': onPlayerReady, 38 'onStateChange': onPlayerStateChange 39 } 40 }); 41 } 42 43 // 該当のコード 44 function onPlayerReady(event) { 45 // JavaScriptでDBから末尾11桁を取得しその値をループさせて配列を作りたい 46 player.cuePlaylist([ 47 '<%= movie.youtube_url %>' 48 ] 49 ); 50 } 51 52 function onPlayerStateChange(event) { 53 console.log(event); 54 } 55 </script> 56 <br> 57 </div> 58 <br> 59 <br> 60 <%= link_to 'Show', movie %> 61 <br> 62 <%= link_to 'Edit', edit_movie_path(movie) %> 63 <br> 64 <%= link_to 'Destroy', movie, method: :delete, data: { confirm: 'Are you sure?' } %> 65 <br> 66 </div> 67 </div> 68 <% end %> 69 </div> 70</div> 71 72<br> 73 74<%= link_to 'New Movie', new_movie_path %> 75<%= paginate @movies %>
Ruby
1# app/controllers/movies_controller.rb 2 3class MoviesController < ApplicationController 4 before_action :set_movie, only: [:show, :edit, :update, :destroy] 5 # before_action :authenticate_user! 6 7 def index 8 @movies = params[:playlist_id].present? ? Playlist.find(params[:playlist_id]).movies.page : Movie.page(params[:page]) 9 end 10 11 def show 12 @movie = Movie.find(params[:id]) 13 end 14 15 def new 16 @movie = Movie.new 17 @movie.playlists.build 18 @movie.movie_playlist_relations.build 19 end 20 21 def edit 22 @movie.playlists.build 23 end 24 25 def create 26 @movie = current_user.movies.build(movie_params) 27 url = params[:movie][:youtube_url] 28 url = url.last(11) 29 @movie.youtube_url = url 30 31 respond_to do |format| 32 if @movie.save 33 format.html { redirect_to @movie, notice: 'Movie was successfully created.' } 34 format.json { render :show, status: :created, location: @movie } 35 else 36 format.html { render :new } 37 format.json { render json: @movie.errors, status: :unprocessable_entity } 38 end 39 end 40 end 41 42 def update 43 @movie.update(update_movie_params) 44 respond_to do |format| 45 if @movie.update(movie_params) 46 format.html { redirect_to @movie, notice: 'Movie was successfully updated.' } 47 format.json { render :show, status: :ok, 48 location: @movie } 49 else 50 format.html { render :edt } 51 format.json { render json: @movie.errors, status: 52 :unprocessable_entity } 53 end 54 end 55 end 56 57 def destroy 58 @movie.destroy 59 respond_to do |format| 60 format.html { redirect_to movies_url, notice: 'Movie was successfully destroyed.' } 61 format.json { head :no_content } 62 end 63 end 64 65 private 66 67 def set_movie 68 @movie = Movie.find(params[:id]) 69 end 70 71 def movie_params 72 params.require(:movie).permit(:title, :youtube_url, playlist_attributes:[:playlist_name], playlist_ids: []) 73 end 74 75 def playlist_params 76 params.require(:playlist).permit(:playlist_name) 77 end 78 79 def update_movie_params 80 params.require(:movie).permit(:title, :youtube_url, playlist_attributes:[:playlist_name], playlist_ids: []) 81 end 82end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/16 15:10 編集