モフモフになれたら

本と映画と仕事と考えたこと

Railsでaudioの再生回数をカウントする方法

問題点

今作り込み中のRails webアプリでは、html内で音声ファイルを再生するaudioタグを使っているのですが、ただ音声ファイルaudio要素から再生するだけでは何回再生されたかカウント出来ません。YoutubeでもSoundCloudでも何回再生されたかはユーザーの大きなモチベーションにつながるので非常に大事なポイントです。

解決策

再生回数をカウントするフィールドをモデルに追加し、audio要素からの再生をjavascriptで制御し、再生する度にcontrollerが起動し再生回数をカウントしていく方法にしました。

実装

下記の例はMusicというモデルに再生回数をカウントするlistenというフィールドを追加して実装したものです。

音声ファイルを置いてあるviewをこんな感じにします。

<button type="button" class="btn btn-success js" onclick="play()"> Play </button>
<button type="button" class="btn btn-warning" onclick="pause()">PAUSE</button>
<button type="button" class="btn btn-secondary" onclick="reset()">RESET</button><br />
<%= audio_tag  @music.url, :controls => true, id: @melody.id %> 再生回数<span class="count"><%= @melody.listen %></span>
var TARGET = document.getElementById("<%=@melody.id %>");

function play(){
    TARGET.play();
}

function pause(){
    TARGET.pause();   
}

function reset(){
    TARGET.pause();
    TARGET.currentTime = 0;
}

これでボタンを押せばjavascriptが作動してPlay,Pause,Resetしてくれます。
さらに

routes.rbに下記を追加。

  get 'increment.json',to: 'melodies#increment'

melodyのcontrollerで

   
  def increment
    @melody = Melody.find(params[:id])
    @melody.listen += 1
    @melody.save
  end

として、さきほどのjavascriptに下記を追加。

 $(document).ready(function() {  
$(".js").click(function() {  
$.ajax({
    url: '/increment.json',
    data: { id : "<%= @melody.id %>" },
    async: false
});
});
});

とすれば、Playボタンをクリックした時にAjaxでmelody#incrementメソッドが起動して、再生回数listenに1づつ追加されていきます。

欠点はPlayを連打されると再生回数が膨れ上がることですねw

とりあえず今ある知識でできたのはこれだけ!後々改良考えます。良い方法あれば教えて下さい!