通过 Spotify Web API 和 JavaScript 播放歌曲时出现问题

2023-12-27

我正在致力于构建一个与 Spotify 交互的基于 Web 的应用程序。我从 C# 开始,访问 API、拉出我的播放列表并从中拉出曲目都没有问题,但似乎您无法使用位于此处的 Spotify Web API 来播放歌曲:

https://developer.spotify.com/documentation/web-api/ https://developer.spotify.com/documentation/web-api/

然后我开始查看位于此处的 Web Playback API:

https://developer.spotify.com/documentation/web-playback-sdk/ https://developer.spotify.com/documentation/web-playback-sdk/

我打算用 c# 编写大部分内容,因为我的 c# 比我的 javascript 强大得多。 C# 部分正在工作。我可以获得授权令牌,提取我的播放列表和曲目。我打算将此信息传递给 javascript。

我从 Spotify 开发者页面提取了以下 JavaScript。我只是有点理解它,所以我不知道为什么它不起作用。非常感谢您提供的任何帮助。

<script src="https://sdk.scdn.co/spotify-player.js"></script>

<script>

window.onSpotifyWebPlaybackSDKReady = () => {
  // You can now initialize Spotify.Player and use the SDK
};

const play = ({
  spotify_uri,
  playerInstance: {
    _options: {
      getOAuthToken,
      id
    }
  }
}) => {
  getOAuthToken(access_token => {
    fetch('https://api.spotify.com/v1/me/player/play', {
      method: 'PUT',
      body: JSON.stringify({ uris: [spotify_uri] }),
      headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ${myaccesstoken}'
      },
    });
  });
};

play({
  playerInstance: new Spotify.Player({ name: "..." }),
  spotify_uri: 'spotify:track:7xGfFoTpQ2E7fRF5lN10tr',
});

</script>

tl;dr:工作片段在这个答案的底部!


你做这个

play({
  playerInstance: new Spotify.Player({ name: "..." }),
  spotify_uri: 'spotify:track:7xGfFoTpQ2E7fRF5lN10tr',
});

以下之外。

window.onSpotifyWebPlaybackSDKReady = () => {
  // You can now initialize Spotify.Player and use the SDK
};

意思是play立即被调用,无需等待 Spotify Web Playback SDK 加载。正如评论所说Spotify.Player可以尽快使用onSpotifyWebPlaybackSDKReady被称为。


另一个问题是您实际上从未创建过 Spotify Connect 设备。这是使用 Spotify Web API 控制该设备所必需的。这可以通过调用来实现connect on the Spotify.Player实例。为了知道什么时候connect完成后,播放器已准备好播放歌曲,您需要首先定义侦听器,如下所示。

player.addListener('ready', ({ device_id }) => {
  console.log('Ready with Device ID', device_id);
});

因此,您实际上需要两个不同的 Spotify API 才能实现您的目标。首先,您需要 Spotify Web Playback SDK 才能创建 Spotify Connect 设备(Spotify 文档将其称为播放器)。之后,您可以使用 Spotify 的 Web API 控制这个确切的 Spotify Connect 设备。


以下片段将播放该歌曲。

警告:这将在您的浏览器中播放音乐,无需任何控制元素!

此代码片段需要一个可以获取的访问令牌here https://developer.spotify.com/documentation/web-playback-sdk/quick-start/点击绿色按钮说Get Your Web Playback SDK Access Token。然后需要将令牌复制粘贴到代码片段的第 11 行中,替换<YOUR_ACCESS_TOKEN_HERE>.

索引.html

<!-- Load the Spotify Web Playback SDK -->
<script src="https://sdk.scdn.co/spotify-player.js"></script>

<script>
  // Called when the Spotify Web Playback SDK is ready to use
  window.onSpotifyWebPlaybackSDKReady = () => {

    // Define the Spotify Connect device, getOAuthToken has an actual token 
    // hardcoded for the sake of simplicity
    var player = new Spotify.Player({
      name: 'A Spotify Web SDK Player',
      getOAuthToken: callback => {
        callback('<YOUR_ACCESS_TOKEN_HERE>');
      },
      volume: 0.1
    });

    // Called when connected to the player created beforehand successfully
    player.addListener('ready', ({ device_id }) => {
      console.log('Ready with Device ID', device_id);

      const play = ({
        spotify_uri,
        playerInstance: {
          _options: {
            getOAuthToken,
            id
          }
        }
      }) => {
        getOAuthToken(access_token => {
          fetch(`https://api.spotify.com/v1/me/player/play?device_id=${id}`, {
            method: 'PUT',
            body: JSON.stringify({ uris: [spotify_uri] }),
            headers: {
              'Content-Type': 'application/json',
              'Authorization': `Bearer ${access_token}`
            },
          });
        });
      };

      play({
        playerInstance: player,
        spotify_uri: 'spotify:track:7xGfFoTpQ2E7fRF5lN10tr',
      });
    });

    // Connect to the player created beforehand, this is equivalent to 
    // creating a new device which will be visible for Spotify Connect
    player.connect();
  };
</script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 Spotify Web API 和 JavaScript 播放歌曲时出现问题 的相关文章

随机推荐

  • 如何在keras转换层中进行零填充?

    我正在尝试实现科学文章中的模型 该文章说他们正在使用零填充 是否可以在中配置此填充keras Conv2D https keras io layers convolutional conv2d 我看到的唯一可能的填充值是 填充 有效 或 相
  • JPA Buddy 逆向工程工具未显示表格

    当我单击 来自数据库的实体 时 它正确连接到数据库 并且成功执行内省 以便我可以从侧面视图看到表列表 但在弹出窗口中我得到 0 个表 0 个视图和 0 个映射关系 0tables https i stack imgur com Gl0Ua
  • Linux 中使用 pipeline() 的链式管道

    我知道如何使用 C 在 Linux 中创建一个管道 如下所示cat tmp txt grep foo 但是我在实现像这样的多个链式管道时遇到问题cat tmp 1 txt uniq c sort 如何使用 C 来做到这一点pipe 在 Li
  • 为什么 PHP 被认为是面向对象的?

    我一直在阅读 OOP 的定义 但不明白为什么 PHP 被认为是面向对象的 这与 PHP 的 基础级别 不具备而更高级的功能却有什么关系吗 在大部分标准库已经创建并且该语言已经建立之后 OO 特性通过版本 3 5 分阶段添加到 PHP 中 背
  • 计算平均值或将 ArrayList 作为函数的参数

    是否有内置方法来计算整数 ArrayList 的平均值 如果没有 我可以创建一个函数 通过获取 ArrayList 的名称并返回其平均值来实现此目的吗 这真的很简单 Better use a List It is more generic
  • php 获取数组的数据大小

    拥有这个数组 Array block1 gt Array list gt Array sub list gt Array links gt Number total gt Number block2 gt Array attributes
  • 如何指定 Android 模拟器应在我的开发计算机上使用哪个网络接口?

    我的开发机器同时连接到两个不同的网络 一种是通过以太网 eth0 另一种是通过 WiFi en1 在这种情况下 Android 模拟器似乎总是想要连接 eth0 上的网络 从命令行启动模拟器时 是否有一个选项可以告诉它使用开发计算机上的特定
  • java中非静态块有什么用? [复制]

    这个问题在这里已经有答案了 可能的重复 实例初始值设定项与构造函数有何不同 https stackoverflow com questions 1355810 how is an instance initializer different
  • 使用捆绑属性增强图形库

    我是 BGL 的新手 尝试使用 BGL 设置一个简单的最短路径查找程序 其中无向图被定义为具有自定义定义的 EdgeProperty 和 VertexProperty 的邻接列表 我收到编译时错误 我将其归因于我在模板和 Boost 方面的
  • spring data jpa @query 和可分页

    我正在使用 Spring Data JPA 当我使用 Queryto 定义查询WITHOUT Pageable 有用 public interface UrnMappingRepository extends JpaRepository
  • 通过instance-id获取实例

    我需要通过实例 ID 获取实例 是否可以在不请求所有实例的列表的情况下完成此操作 我试过了 ec2 conn boto connect ec2 aws access key id key aws secret access key acce
  • 如何提高winform的加载时间?

    我有一个 WinForms 应用程序 主窗体有很多控件 这也是加载速度非常慢的原因之一 我想做的是使表单加载速度更快 我已经设置了beginupdate和endupdate 该表单不会在后台工作线程中呈现 因为这是主表单 没有初始形式 当用
  • 如何控制android中的视频捕获属性?

    我正在使用以下意图捕获视频 Intent takeVideoIntent new Intent MediaStore ACTION VIDEO CAPTURE if takeVideoIntent resolveActivity getPa
  • 允许匿名访问受保护的 Subversion 存储库的部分内容

    我们目前面临的问题是允许人们访问 subversion 存储库的某些部分 1 5 x 很快是 1 6 x 而其他部分是安全的 让我给你一些细节 我们有一个生产服务器 其中许多项目都有自己的颠覆存储库 对于每个项目 我们的 Apache 配置
  • Docker Compose 与多阶段构建

    有了这个新版本 https blog docker com 2017 06 announcing docker 17 06 community edition ce Docker 引入了多阶段构建 至少我以前从未听说过 我现在的问题是 我应
  • 使用 Spring Data Rest 时如何从组件扫描中排除 @Repository

    在 Spring Boot 项目中 我在从组件扫描中排除某些存储库时遇到问题 我有一个包含一些实体和一些存储库 JpaRepositories 的库 由于某种原因 我实现了一个小型 Spring Boot Data Rest 应用程序 用于
  • 如何在 Rust 中打印 sha256 哈希值? (通用数组)

    我正在测试 sha2 箱子 https docs rs sha2 0 9 3 sha2 https docs rs sha2 0 9 3 sha2 let base2 i32 2 let total size base2 pow 24 le
  • UISearchController 推送时不会隐藏视图

    我正在使用 UISearchController 在 UITableView 中显示搜索栏和结果 我设法正确设置它 但是当我搜索结果 然后选择表视图中的一行 并将新的视图控制器推送到导航堆栈时 我希望搜索栏不再可见 但是 当我尝试此操作时
  • 将数据框列转换为存储在列表中的向量

    我的数据由许多列 变量和三行组成 每个变量都是一个整数 其值随行和列的不同而变化 下面是我的数据的一个最小示例 Minimal example of data frame I have df lt data frame x1 c 1 2 3
  • 通过 Spotify Web API 和 JavaScript 播放歌曲时出现问题

    我正在致力于构建一个与 Spotify 交互的基于 Web 的应用程序 我从 C 开始 访问 API 拉出我的播放列表并从中拉出曲目都没有问题 但似乎您无法使用位于此处的 Spotify Web API 来播放歌曲 https develo