gpt4 book ai didi

ruby - 使用 Ruby SDK 从 Soundcloud 下载轨道

转载 作者:数据小太阳 更新时间:2023-10-29 08:27:06 25 4
gpt4 key购买 nike

我正在尝试使用带有应用程序的 ruby​​ sdk(soundcloud 0.2.0 gem)从 Soundcloud 下载轨道。我已经在 soundcloud 上注册了该应用程序并且 client_secret 是正确的。我知道这一点,因为我可以使用该应用程序查看我的个人资料信息和轨道。现在,当我尝试使用以下代码下载轨道时

@track = current_user.soundcloud_client.get(params[:track_uri])
data = current_user.soundcloud_client.get(@track.download_url)
File.open("something.mp3","wb"){|f|f.write(data)}

当我打开文件时,里面什么也没有。我尝试了很多方法,包括以下一种,

data = current_user.soundcloud_client.get(@track.download_url)
file = File.read(data)

这个给了我一个错误

can't convert nil into String 

第 13 行在

app/controllers/store_controller.rb:13:in `read' 

那是 File.read 函数。

我已仔细检查我尝试下载的轨道是否公开且可下载。我尝试通过从控制台复制它并使用 Postman 发送请求来测试明确使用的 download_url 并且它有效。我不确定为什么当其他事情运行良好时它不能与该应用程序一起工作。

我想做的是能够成功下载或至少获取我可以存储在某处的数据。

版本详情:-
ruby 1.9.3p194(2012-04-20 修订版 35410)[x86_64-linux]
导轨 3.2.18
声云 0.2.0

最佳答案

在做这件事之前,您必须了解一些假设。

  • 并非 SoundClound 上的所有轨道可以下载!只能下载标记为可下载 的轨道 - 您的代码必须考虑该选项!
  • 在您到达 download_url 之前必须“解析”您的轨道 URL,在您获得 download_url 之后您必须使用您的 client_id 来获得最终的下载 URL。
  • 轨道可以很大,降低轨道需要时间!你永远不应该直接从你的 Controller 或模型中的 Rails 应用程序执行这样的任务。如果任务运行时间更长,您总是会使用一些后台 worker 或其他类型的后台处理“东西”- Sidekiq例如。

命令行客户端示例

这是工作客户端的示例,您可以使用它从 SoundClound 下载轨道.其使用官方Official SoundCloud API Wrapper for Ruby ,假设您使用的是 Ruby 1.9.x 并且它不以任何方式依赖于 Rails。

# We use Bundler to manage our dependencies
require 'bundler/setup'

# We store SC_CLIENT_ID and SC_CLIENT_SECRET in .env
# and dotenv gem loads that for us
require 'dotenv'; Dotenv.load

require 'soundcloud'
require 'open-uri'

# Ruby 1.9.x has a problem with following redirects so we use this
# "monkey-patch" gem to fix that. Not needed in Ruby >= 2.x
require 'open_uri_redirections'

# First there is the authentication part.
client = SoundCloud.new(
client_id: ENV.fetch("SC_CLIENT_ID"),
client_secret: ENV.fetch("SC_CLIENT_SECRET")
)

# Track URL, publicly visible...
track_url = "http://soundcloud.com/forss/flickermood"

# We call SoundCloud API to resolve track url
track = client.get('/resolve', url: track_url)

# If track is not downloadable, abort the process
unless track["downloadable"]
puts "You can't download this track!"
exit 1
end

# We take track id, and we use that to name our local file
track_id = track.id
track_filename = "%s.aif" % track_id.to_s
download_url = "%s?client_id=%s" % [track.download_url, ENV.fetch("SC_CLIENT_ID")]

File.open(track_filename, "wb") do |saved_file|
open(download_url, allow_redirections: :all) do |read_file|
saved_file.write(read_file.read)
end
end

puts "Your track was saved to: #{track_filename}"

另请注意,文件位于 AIFF (Audio Interchange File Format) 中.要将它们转换为 mp3,您可以使用 ffmpeg 执行类似的操作.

ffmpeg -i 293.aif final-293.mp3

关于ruby - 使用 Ruby SDK 从 Soundcloud 下载轨道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25622120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com