成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

給自己的網(wǎng)站添加網(wǎng)易云音樂(lè)歌單吧^ ^

RaoMeng / 3341人閱讀

摘要:每次用網(wǎng)易云音樂(lè)客戶端播放聽歌的時(shí)候,收藏的歌曲,在我的博客上也可以同步進(jìn)行更新。

最近應(yīng)該發(fā)現(xiàn),我的博客https://blog.codelabo.cn左下角多了一個(gè)音樂(lè)播放器

這個(gè)是怎么實(shí)現(xiàn)的?一起來(lái)看看吧

APlayer

首先我們需要一個(gè)音頻播放器,這里我用到了APlayer,這是由bilibili前端大神DIYgod開源的播放器,有興趣的可以去TA的主頁(yè)看看,非常驚艷,這里我就不多說(shuō)了

我們看一下APlayer的官方文檔,方法很簡(jiǎn)單


const ap = new APlayer({
    container: document.getElementById("aplayer"),
    audio: [{
        name: "name",
        artist: "artist",
        url: "url.mp3",
        cover: "cover.jpg"
    }]
});

這里的audio是一個(gè)音頻列表,可以是一個(gè)對(duì)象或?qū)ο髷?shù)組

對(duì)象具體的參數(shù)如下

名稱 描述
name 音頻名稱
artist 音頻藝術(shù)家
url 音頻鏈接
cover 音頻封面
lrc 音頻歌詞

LRC一共有三種方式來(lái)給 APlayer 傳遞歌詞,詳情可參考https://aplayer.js.org/#/home?id=lrc,

這里我們選擇最方便的一種,直接給LRC鏈接

網(wǎng)易云音樂(lè)API

這部分我找到了網(wǎng)上有人分享的API,這種官方不可能給公開API,所以還是要小心使用,說(shuō)不定哪天就被修改了

http://moonlib.com/606.html

我們現(xiàn)在其實(shí)想要兩個(gè),一個(gè)是歌單的列表,還有一個(gè)是歌詞。

# 歌單

https://music.163.com/api/playlist/detail?id=37880978
id為歌單ID
# 歌詞

https://music.163.com/api/song/lyric?os=pc&id=93920&lv=-1&kv=-1&tv=-1
id為歌曲ID
lv:值為-1,我猜測(cè)應(yīng)該是判斷是否搜索lyric格式
kv:值為-1,這個(gè)值貌似并不影響結(jié)果,意義不明
tv:值為-1,是否搜索tlyric格式
接口實(shí)現(xiàn)

雖然我們已經(jīng)找到了網(wǎng)易云音樂(lè)API,但是返回的數(shù)據(jù)不是我們所需要的呀

比如這個(gè)歌單的接口

# Request

https://music.163.com/api/playlist/detail?id=2119983629

# Response

{
  "result":{
      "subscribers":[],
      "subscribed": false,
      "creator":{...},
      "artists": null,
      "tracks":[
        {
          album: {
              name: "メトロノーム", 
              id: 36787278, type: "專輯", 
              size: 12, picId:18419018788768520,
          }
          alias: [],
          artists: [{name: "MACO", id: 901025, picId: 0, img1v1Id: 0, briefDesc: "",…}],
          audition: null,
          bMusic: {...},
          commentThreadId: "R_SO_4_515573221",
          copyFrom: "",
          copyright: 1,
          copyrightId: 7003,
          crbt: null,
          ...
        }
      ]
  }
}

里面字段很多,我上面只列舉了一部分,tracks就是歌單列表,但是很顯然,和我們需要的格式還差很多

那么怎么來(lái)轉(zhuǎn)換一下,變成我們需要的數(shù)據(jù)格式呢?

[{
    name: "name",
    artist: "artist",
    url: "url.mp3",
    cover: "cover.jpg",
    lrc: "a.lrc"
}]

這里我們就需要在服務(wù)端來(lái)完成了,思路很簡(jiǎn)單,在服務(wù)器上請(qǐng)求https://music.163.com/api/playlist/detail?id=2119983629這個(gè)接口,然后拿到結(jié)果后手動(dòng)處理一下,最后再返給客戶端,相當(dāng)于做了一次中轉(zhuǎn)

我這里服務(wù)端是用koa實(shí)現(xiàn)的,其他框架應(yīng)該差不多
服務(wù)端發(fā)起請(qǐng)求

在服務(wù)端發(fā)起請(qǐng)求也可以用我們熟悉的fetch,不過(guò)你需要先安裝node-fetch這個(gè)庫(kù)

yarn add node-fetch

然后你就可以像前端一樣發(fā)起請(qǐng)求了

const fetch = require("node-fetch");

//...

const getPlayList = (id) => {
    return fetch(`http://music.163.com/api/playlist/detail?id=${id}`)
    .then((response) => {
        if (response.ok) {
            return response.json();
        }
    })
    .catch((err) => {
        console.warn(err);
    })
}
接口定義

現(xiàn)在我們需要新增一個(gè)接口用來(lái)處理歌單,返回出我們需要的格式

//獲取音樂(lè)列表
router.get("/playlist/:id", async (ctx, next) => {
    const responseData = {
        "success": false,
        "data":[],
        "message": "",
    }
    const { id } = ctx.params;
    try {
        const data = await getPlayList(id);
        if(data.code===200){
            const playList = data.result.tracks.map(item=>({
                id: item.id,
                name: item.name,
                artist: item.artists.map(el=>el.name).join(","),//由于歌手是一個(gè)數(shù)組,這里我們把它轉(zhuǎn)換成字符串拼接
                url: `https://music.163.com/song/media/outer/url?id=${item.id}.mp3`,//歌曲地址
                cover: item.album.picUrl.replace(/http:/,"https:"),
                lrc:null
            }))
            responseData.success = true;
            responseData.message = "操作成功";
            responseData.data = playList;
            ctx.body = responseData;
        }
    } catch (error) {
        responseData.success = false;
        responseData.message = error.message;
        responseData.data = [];
        ctx.body = responseData;
    }
});

注意這里的歌曲鏈接url,本來(lái)返回信息里面是不包含的,只有歌曲ID,不過(guò)我們發(fā)現(xiàn)通過(guò)https://music.163.com/song/media/outer/url?id=ID可以直接在線播放指定ID的歌曲,所以我們這里直接寫在返回結(jié)果上。

歌詞處理

還有一個(gè)問(wèn)題就是歌詞,上面的接口中,歌詞返回結(jié)果也不是我們需要的格式

# Request

https://music.163.com/api/song/lyric?os=pc&id=93920&lv=-1&kv=-1&tv=-1

# Response

{
  "sgc": true,
  "sfy": false,
  "qfy": false,
  "lrc": {
    "version": 7,
    "lyric": "[00:29.620]細(xì)雨帶風(fēng)濕透黃昏的街道
[00:35.050]抹去雨水雙眼無(wú)幫地仰望
[00:40.240]望向孤單的晚燈是那傷感的記憶
[00:48.630]再次泛起心里無(wú)數(shù)的思念
[00:54.000]以往片刻歡笑仍掛在臉上
[00:58.770]愿你此刻可會(huì)知是我衷心的說(shuō)聲
[01:06.310]喜歡你
[01:08.940]那雙眼動(dòng)人笑聲更迷人
[01:14.330]愿再可輕撫你那可愛(ài)面容
[01:22.490]挽手說(shuō)夢(mèng)話象昨天你共我
[01:42.970]滿帶理想的我曾經(jīng)多沖動(dòng)
[01:48.340]埋怨與她相愛(ài)難有自由
[01:53.040]愿你此刻可會(huì)知是我衷心的說(shuō)聲
[02:00.420]喜歡你
[02:03.230]那雙眼動(dòng)人笑聲更迷人
[02:08.540]愿再可輕撫你那可愛(ài)面容
[02:16.750]挽手說(shuō)夢(mèng)話象昨天你共我
[02:24.740]每晚夜里自我獨(dú)行
[02:27.670]隨處蕩 多冰冷
[02:35.070]以往為了自我掙扎從不知她的痛苦
[02:49.380]喜歡你
[02:52.020]那雙眼動(dòng)人笑聲更迷人
[02:57.420]愿再可輕撫你那可愛(ài)面容
[03:05.590]挽手說(shuō)夢(mèng)話象昨天你共我
[03:13.870]挽手說(shuō)夢(mèng)話象昨天你共我
"
  },
  "klyric": {...},
  "code": 200
}

反正就是很全面,但是我們需要的僅僅是里面的內(nèi)容部分,比如上面我就只需要這一段

[00:29.620]細(xì)雨帶風(fēng)濕透黃昏的街道
[00:35.050]抹去雨水雙眼無(wú)幫地仰望
[00:40.240]望向孤單的晚燈是那傷感的記憶
[00:48.630]再次泛起心里無(wú)數(shù)的思念
[00:54.000]以往片刻歡笑仍掛在臉上
[00:58.770]愿你此刻可會(huì)知是我衷心的說(shuō)聲
...

所以我們需要再次做一個(gè)中介處理

const getLyric = (id) => {
    return fetch(`http://music.163.com/api/song/lyric?os=pc&id=${id}&lv=-1&kv=-1&tv=-1`)
    .then((response) => {
        if (response.ok) {
            return response.json();
        }
    })
    .catch((err) => {
        console.warn(err);
    })
}

//獲取音樂(lè)歌詞
router.get("/lyric/:id", async (ctx, next) => {
    const { id } = ctx.params;
    try {
        const lyric = await getLyric(id);
        ctx.body = lyric.lrc.lyric;//返回指定部分
    } catch (error) {
        ctx.body = "";
    }
});

這樣在上面歌詞列表中就可以直接用/api/lyric/:ID來(lái)獲取歌詞了

//...
{
  id: item.id,
  name: item.name,
  artist: item.artists.map(el=>el.name).join(","),
  url: `https://music.163.com/song/media/outer/url?id=${item.id}.mp3`,
  cover: item.album.picUrl.replace(/http:/,"https:"),
  lrc:`/api/lyric/${item.id}`//這里歌詞寫上我們定義的接口地址
}
//...
測(cè)試一下吧

通過(guò)以上處理,我們接口就返回我們自定義的數(shù)據(jù)格式了

# Request

https://localhost:3000/api/playlist/2119983629

# Response

{
  "success": true,
  "data": [
     {
      "id": 515573221,
      "name": "Sweet Memory",
      "artist": "MACO",
      "url": "https://music.163.com/song/media/outer/url?id=515573221.mp3",
      "cover": "https://p1.music.126.net/-U7mfaIjENUu8G_O0Dhv8g==/18419018788768520.jpg",
      "lrc": "/api/lyric/515573221"
    },
    {
      "id": 488388942,
      "name": "願(yuàn)い~あの頃のキミへ~",
      "artist": "當(dāng)山みれい",
      "url": "https://music.163.com/song/media/outer/url?id=488388942.mp3",
      "cover": "https://p1.music.126.net/kbLlBkGfEcA3RJyC5JhkDA==/18346451021830743.jpg",
      "lrc": "/api/lyric/488388942"
    },
    ...
  ],
  "message": "操作成功"
}
添加到博客

其實(shí)上面對(duì)接口的數(shù)據(jù)改造才是關(guān)鍵,下面添加到自己的頁(yè)面就很簡(jiǎn)單了。

如果你是傳統(tǒng)HTML頁(yè)面,可以直接文章開頭的方式引用


const ap = new APlayer({
    container: document.getElementById("aplayer"),
    audio: [{
        name: "name",
        artist: "artist",
        url: "url.mp3",
        cover: "cover.jpg"
    }]
});

如果使用了使用模塊管理器:

import "APlayer/dist/APlayer.min.css";
import APlayer from "APlayer";

const ap = new APlayer(options);

如果是react項(xiàng)目,那么可以用封裝好的react-aplayer

import React from "react";
import ReactAplayer from "react-aplayer";

export default class App extends React.Component {
  // event binding example
  onPlay = () => {
    console.log("on play");
  };

  onPause = () => {
    console.log("on pause");
  };

  // example of access aplayer instance
  onInit = ap => {
    this.ap = ap;
  };

  render() {
    const props = {
      theme: "#F57F17",
      lrcType: 3,
      audio: [
        {
          name: "光るなら",
          artist: "Goose house",
          url: "https://moeplayer.b0.upaiyun.com/aplayer/hikarunara.mp3",
          cover: "https://moeplayer.b0.upaiyun.com/aplayer/hikarunara.jpg",
          lrc: "https://moeplayer.b0.upaiyun.com/aplayer/hikarunara.lrc",
          theme: "#ebd0c2"
        }
      ]
    };

    return (
      
{/* example of access aplayer instance API */}
); } }

如果是vue項(xiàng)目,可以使用vue-aplayer

其他更多可以參考Aplayer生態(tài)

小節(jié)

這里的歌單,我選擇了自己收藏的歌曲。每次用網(wǎng)易云音樂(lè)客戶端播放聽歌的時(shí)候,收藏的歌曲,在我的博客上也可以同步進(jìn)行更新。

差不多就這些了,可能對(duì)于專業(yè)后端開發(fā)來(lái)說(shuō),這些完全就是小學(xué)生操作,但是對(duì)于一個(gè)前端來(lái)說(shuō),做這些事就感覺(jué)闖入了一片新天地,還是有很多感悟的。很多以前前端做不了的事,現(xiàn)在nodeJS也能幫我們解決,進(jìn)一步打通了前后端的天然屏障,離全棧也越來(lái)越近了 ^ ^

大家如果喜歡我的博客,可以多多關(guān)注一下

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/98655.html

相關(guān)文章

  • selenium實(shí)戰(zhàn)-同步網(wǎng)易音樂(lè)歌單到qq音樂(lè)

    摘要:對(duì)于這次的爬蟲來(lái)說(shuō),由于網(wǎng)易云音樂(lè)以及音樂(lè)網(wǎng)頁(yè)中大部分元素都是使用渲染生成的,因此選擇使用來(lái)完成這次的腳本。可以發(fā)現(xiàn)網(wǎng)易云音樂(lè)的手機(jī)版歌單地址是?,F(xiàn)在已經(jīng)支持網(wǎng)易云音樂(lè)與音樂(lè)歌單的互相同步。 本文主要介紹selenium在爬蟲腳本的實(shí)際應(yīng)用。適合剛接觸python,沒(méi)使用過(guò)selenium的童鞋。(如果你是老司機(jī)路過(guò)的話,幫忙點(diǎn)個(gè)star吧) 項(xiàng)目地址 https://github.c...

    dailybird 評(píng)論0 收藏0
  • HTML+CSS+JAVASCRIPT 高仿低配網(wǎng)頁(yè)版網(wǎng)易音樂(lè)播放器

    摘要:高仿低配網(wǎng)頁(yè)版網(wǎng)易云音樂(lè)播放器前言沒(méi)有使用任何框架,只是想用最簡(jiǎn)單純的代碼實(shí)現(xiàn)下前臺(tái)后臺(tái)是參考網(wǎng)上的例子寫的,代碼是在的基礎(chǔ)上重新寫的還有她的姊妹篇網(wǎng)易云音樂(lè)移動(dòng)端,請(qǐng)查看這里寫在前頭的話鄙人野生前端一只,專業(yè),自學(xué)前端已經(jīng)一年多了 HTML+CSS+JAVASCRIPT 高仿低配網(wǎng)頁(yè)版網(wǎng)易云音樂(lè)播放器 showImg(https://segmentfault.com/img/remo...

    RaoMeng 評(píng)論0 收藏0
  • HTML+CSS+JAVASCRIPT 高仿低配網(wǎng)頁(yè)版網(wǎng)易音樂(lè)播放器

    摘要:高仿低配網(wǎng)頁(yè)版網(wǎng)易云音樂(lè)播放器前言沒(méi)有使用任何框架,只是想用最簡(jiǎn)單純的代碼實(shí)現(xiàn)下前臺(tái)后臺(tái)是參考網(wǎng)上的例子寫的,代碼是在的基礎(chǔ)上重新寫的還有她的姊妹篇網(wǎng)易云音樂(lè)移動(dòng)端,請(qǐng)查看這里寫在前頭的話鄙人野生前端一只,專業(yè),自學(xué)前端已經(jīng)一年多了 HTML+CSS+JAVASCRIPT 高仿低配網(wǎng)頁(yè)版網(wǎng)易云音樂(lè)播放器 showImg(https://segmentfault.com/img/remo...

    sean 評(píng)論0 收藏0
  • Vue 實(shí)現(xiàn)網(wǎng)易音樂(lè) WebApp

    摘要:基于等開發(fā)一款移動(dòng)端音樂(lè),界面參考了安卓版的網(wǎng)易云音樂(lè)布局適配常見(jiàn)移動(dòng)端。圖標(biāo)使用阿里巴巴圖標(biāo)庫(kù),中間的唱片旋轉(zhuǎn)動(dòng)畫使用了實(shí)現(xiàn)。搜索功能實(shí)現(xiàn)功能搜索歌手歌單歌曲熱門搜索數(shù)據(jù)節(jié)流上拉刷新保存搜索記錄。 基于 Vue(2.5) + vuex + vue-router + vue-axios +better-scroll + Scss + ES6 等開發(fā)一款移動(dòng)端音樂(lè) WebApp,UI ...

    Karuru 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<