Воспроизведение MP3 через Ruby on Rails в хроме

Я пишу приложение Ruby on Rails, которое позволяет пользователю загружать mp3-файл, а затем воспроизводить его. У меня это работает до такой степени, что пользователь может делать эти вещи, НО есть проблема при поиске по песне. Если пользователь ищет вперед (или позволяет воспроизвести) к определенному месту в песне, обычно примерно на 2/3 или 3/4 пути по песне, а затем пытается вернуться к началу (например, 0:20), таймер воспроизведения перейдет на 0:20, как и должно быть, но фактический звук начнется снова, как если бы пользователь стремился к 0:00.

Прямо сейчас я просто пытаюсь заставить песню воспроизводиться в базовом mp3-плеере html5 в Chrome, который он использует при передаче mp3-файла. Это код, который я использую для обслуживания файла, надеюсь, со всеми правильными заголовками:

  file_begin = 0
  file_size = @media.file_file_size 
  file_end = file_size - 1

  if !request.headers["Range"]
    status_code = "200 OK"
  else
    status_code = "206 Partial Content"
    match = request.headers['range'].match(/bytes=(\d+)-(\d*)/)
    if match
      file_begin = match[1]
      file_end = match[1] if match[2] && !match[2].empty?
    end
    response.header["Content-Range"] = "bytes " + file_begin.to_s + "-" + file_end.to_s + "/" + file_size.to_s
  end
  response.header["Content-Length"] = (file_end.to_i - file_begin.to_i + 1).to_s
  response.header["Last-Modified"] = @media.file_updated_at.to_s

  response.header["Cache-Control"] = "public, must-revalidate, max-age=0"
  response.header["Pragma"] = "no-cache"
  response.header["Accept-Ranges"]=  "bytes"
  response.header["Content-Transfer-Encoding"] = "binary"
  send_file(DataAccess.getUserMusicDirectory(current_user.public_token) + @media.sub_path, 
            :filename => @media.file_file_name,
            :type => @media.file_content_type, 
            :disposition => "inline",
            :status => status_code,
            :stream =>  'true',
            :buffer_size  =>  4096)

Я был бы признателен за любое понимание этой проблемы. Я чувствую, что я так близок, потому что почти все работает, за исключением поиска в начале, вызывающего новый запрос.

Спасибо!


person Garrett    schedule 29.09.2011    source источник
comment
Мне было интересно, не учитывает ли send_file Webrick заголовок Content-Range, поэтому вместо отправки части песни, которую искал пользователь, он просто повторно отправляет весь файл? Есть ли способ заставить webrick и send_file придерживаться заголовка Content-Range, чтобы он отправлял только часть файла, а не весь?   -  person Garrett    schedule 30.09.2011


Ответы (1)


Является ли повторное изобретение колеса требованием? Причина, по которой я спрашиваю, заключается в том, что вы могли просто разрешить пользователю загружать файл MP3 и использовать функцию html5, поскольку вы ориентируетесь на Chrome. Paperclip мог бы позаботиться о загрузке в предпочтительное место в общем каталоге, и вы просто передаете этот путь тег.

Безумные идеи удалены из моих комментариев (ниже), чтобы не сбивать с толку других читателей SO. См. мой последний комментарий для решения, но Amazon S3 — лучшее решение.

person Michael De Silva    schedule 30.09.2011
comment
Я понимаю, что вы говорите, и я использую скрепку для загрузки, но я хочу, чтобы воспроизведение было ограничено пользователем, пользователь может слушать только те песни, которые он загрузил. Поэтому, чтобы ограничить использование, я не помещаю его в общий каталог, потому что тогда любой пользователь сможет прослушать любой файл. - person Garrett; 30.09.2011
comment
Так что вместо того, чтобы полностью скрывать файлы, я должен просто скрыть их местоположение настолько, чтобы их было трудно найти? Это возможность, и ее совсем не сложно реализовать. Я просто немного сомневаюсь в идее размещения всех пользовательских файлов в общей папке, потому что это потенциально может открыть доступ к файлам способами, которые я не хочу, чтобы они были. - person Garrett; 30.09.2011
comment
Что ж, одним из вариантов было бы обслуживать активы из Amazon S3. - person Michael De Silva; 30.09.2011
comment
Да, не обращайте внимания на мои сумасшедшие идеи - держитесь подальше от публики. Вместо этого смотрите эту ссылку. - person Michael De Silva; 30.09.2011