网易云音乐API查询歌曲

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\AdminController;
use App\Http\Controllers\Utils\Code;
use App\Models\Music;
use App\Models\UserSearch;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;


class MusicController extends AdminController
{
    protected $rootUrl='https://api.imjad.cn/cloudmusic/?',$musicUserSearchModel,$musicModel;

    public function __construct(Request $request)
    {
        parent::__construct($request);
        $this->musicModel = Music::getInstance();
        $this->musicUserSearchModel = UserSearch::getInstance();
    }

    /**
     * 用户搜索
     * @param Request $request
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View
     */
    public function index(Request $request)
    {
        if ($request->isMethod('get')){
            return view('admin.music.index');
        }
        //获取网易歌曲参数
        $validate = Validator::make($this->postArr,['search_type'=>'required','s'=>'required']);
        if ($validate->fails()){
            return ajax_return(Code::SUCCESS,'success','',$validate->errors()->first());
        }
        $data = array('type' =>'search', 'search_type' =>$this->postArr['search_type'], 'limit' =>$this->postArr['limit'], 'offset' =>$this->postArr['page'], 's' =>$this->postArr['s']);
        $sessionAdmin = $request->session()->get('admin');
        //查询关键词
        $userSearchData = array('s' =>$this->postArr['s'],
            'username' =>empty($sessionAdmin->username)?(empty($sessionAdmin->user)?'游客':$sessionAdmin->user):$sessionAdmin->username,
            'ip' =>$request->ip(), 's_type' =>$this->postArr['search_type'], 'status' =>'1');
        //用户搜索关键词插入数据库,进行同步数据
        $searchWhere[] = array('s','=',$this->postArr['s']);
        $searchWhere[] = array('s_type','=',$this->postArr['search_type']);
        $userSearch = $this->musicUserSearchModel->getResult($searchWhere);
        if (empty($userSearch)){
            $this->musicUserSearchModel->addResult($userSearchData);
        }
        switch ($this->postArr['form']){
            case 'api':
                return $this->search($data);
                break;
            case 'self':
                $result = $this->musicModel->getResultLists($this->postArr['s'],$this->postArr['page'],$this->postArr['limit']);
                foreach ($result['data'] as $item){
                    $item->search_type_name = $this->searchType($item->search_type);
                }
                return ajax_return(Code::SUCCESS,'success','',$result);
                break;
            default:
                return ajax_return(Code::ERROR,'error');
                break;
        }
    }

    /**
     * 获取
     * @param array $data
     * @return \Illuminate\Http\JsonResponse
     */
    protected function search($data)
    {
        $url = $this->rootUrl.http_build_query($data);
        $result = json_decode(http_curl($url,[],'get'),true);
        $arr = [];
        if ($result['code']!=200){
            return ajax_return($result['code'],'error');
        }
        $i = 0;
        foreach ($result['result']['songs'] as $item) {
            $i++;
            $music['music_id'] = $item['id'];
            $music['music_name'] = $item['name'];
            $music['music_time'] = sprintf("%.0f",$item['dt']/1000);
            $music['mv'] = $item['mv'];
            $music['singer_name'] = $item['ar'][0]['name'];
            $music['singer_id'] = $item['ar'][0]['id'];
            $music['pic_url'] = $item['al']['picUrl'];
            $music['s'] = $data['s'];
            $music['search_type'] = $data['search_type'];
            $music['search_type_name'] = $this->searchType($data['search_type']);
            $music['id'] = $i;
            $arr['data'][] = $music;
        }
        $arr['total'] = $result['result']['songCount'];
        return ajax_return(Code::SUCCESS,'success','',$arr);
    }

    /**
     * 获取歌曲详情
     * @param  Request $request
     * @return array
     */
    public function play(Request $request)
    {
        if ($request->isMethod('get')){
            return ajax_return(Code::METHOD_ERROR,'error');
        }
        $music = $this->musicModel->getResult('music_id',$this->postArr['music_id']);
        if (!empty($music->music_url) && strtotime('+1 day',strtotime($music->updated_at))>strtotime(date("Y-m-d 23:59:59")) && $this->postArr['form'] === 'mysql'){
            $arr['music_url'] = $music->music_url;
            return ajax_return(Code::SUCCESS,'success','',$arr);
        }
        $data = array('type' =>'song', 'id' =>$this->postArr['music_id']);
        $result = json_decode(http_curl($this->rootUrl,$data,'get'),true);
        if ($result['code']!=200){
            return ajax_return($result['code'],'error');
        }
        $arr['music_url'] = $result['data'][0]['url'];
        $this->postArr['br'] = $result['data'][0]['br'];
        $this->musicModel->updateResult($arr,'music_id',$this->postArr['music_id']);
        return ajax_return(Code::SUCCESS,'success','',$arr);
    }

    /**
     * 单曲类型
     * @param $s_type
     * @return mixed|array
     */
    protected function searchType($s_type='')
    {
        $arr = [1 =>'单曲',10=>'专辑',100=>'歌手',1000=>'歌单',1002=>'用户',1004=>'mv',1006=>'歌词',1009=>'主播电台'];
        if (!empty($s_type)){
            return $arr[$s_type];
        }
        return $arr;
    }
}
layui.define(['layer','laypage'],function (exports) {
    let layer = layui.layer,laypage=layui.laypage,layIndex;
    layIndex = layer.load(2,{time:0,shade:[0.7,'#fff']});
    function initPage(total,cur_page,limit)
    {
        laypage.render({
            elem:"page",
            curr:cur_page||1,
            count:total,
            limit:limit,
            layout: ['count', 'prev', 'page', 'next', 'skip'],
            limits:[10,30,50,100],
            jump:function (obj,first) {
                if(!first){
                    app.page=obj.curr;
                }
            }
        })
    }
    let app = new Vue({
        el:"#app",
        data:{
            list:[],
            page:1,
            limit:20,
            cgi:{
                index:window.location.pathname,
                play:'/admin/music/play'
            },
            search_type:1,
            s:'粤语',
            form:'self',
            headers:{'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
            intVal:0,
            indexVal:0,
            playing:false  //是否播放
        },
        methods:{
            getLists:function (page,limit) {
                let __self = this;
                $.ajax({
                    type:'post',
                    url:__self.cgi.index,
                    data:{page:page,limit:limit,search_type:__self.search_type,s:__self.s,form:__self.form},
                    headers: __self.headers,
                    dataType:'json',
                    success:function (response) {
                        console.log(response);
                        if (response.code === 200){
                            layer.close(layIndex);
                            initPage(response.item.total,__self.page,__self.limit);
                            __self.list =response.item.data;
                        }
                    }
                })
            },
            /**
             * todo:播放音乐
             * @param index
             */
            play:function (index) {
                //关闭所有窗口
                layer.closeAll();
                let __self = this;
                __self.list[index].form = __self.form;
                $.ajax({
                    type:'post',
                    url:__self.cgi.play,
                    data:__self.list[index],
                    headers: __self.headers,
                    dataType:'json',
                    success:function (response) {
                        if (response.code === 200){
                            layer.open({
                                title:__self.list[index].music_name,
                                type:1,
                                content:'<div style="text-align: center;margin:20px 0">' +
                                    '<img src="'+__self.list[index].pic_url+'" alt="" width="200px"/>' +
                                    '<audio src="'+response.item.music_url+'" controls autoplay style="width: 80%;margin-top: 20px" id="music"></audio>' +
                                    '</div>',
                                maxmin:true,
                                shade: 0,
                                shadeClose:false,
                                closeBtn:false,
                                area:['600px','400px']
                            });
                            __self.intVal = 0;
                            __self.indexVal = index+1;
                            __self.playing = true;
                        }else{
                            layer.msg('获取歌曲失败,请重试~',{icon:5});
                        }
                        console.log(response);
                    }
                })
            },
            /**
             * todo:定时器
             */
            clock:function () {
                this.intVal++;
                if (this.list[this.indexVal-1] && this.intVal===parseInt(this.list[this.indexVal-1].music_time)) {
                    if (this.indexVal === this.limit){
                        this.indexVal = 0;
                        this.page++;
                        this.getLists(this.page,this.limit);
                    }
                    this.play(this.indexVal);
                    this.intVal = 0;
                }
                console.log('===当前页==='+this.page);
                console.log('===当前播放歌曲==='+this.indexVal);
                console.log('===当前歌曲播放时长==='+this.intVal);
                console.log('===当前歌曲播放状态==='+this.playing);
            },
            /**
             * todo:歌曲搜索
             */
            searchMusic:function () {
                this.getLists(this.page,this.limit)
            }
        },
        mounted:function(){
            this.$nextTick(function () {
                this.getLists(this.page,this.limit);
            })
        },
        created () {
            setInterval(() => {
                if (false!==this.playing){
                    this.clock()
                }
            }, 1000)
        },
        watch:{
            page:function () {
                this.getLists(this.page,this.limit)
            }
        },
        computed:{
            is_null:function () {
                return this.list.length===0;
            }
        }
    });
    exports('music');
});
{{--模板继承--}}
@extends('layouts.admin')
{{--@yield 设置  @section 当子页面继承布局之后,即可使用 @section 命令将内容注入于布局的 @section 区块中  --}}
@section('content')
    <div id="app">
        <div class="layui-form-item" style="margin-bottom: 10px">
            <div class="layui-input-inline">
                <input type="text" placeholder="搜索" v-model="s" class="layui-input">
            </div>
            <div class="layui-input-inline form-group">
                <select v-model="form" class="layui-select layui-input" @change="searchMusic()" placeholder="">
                    <option value="api">API</option>
                    <option value="self">MYSQL</option>
                </select>
            </div>
            <button class="layui-btn layui-btn-normal" @click="searchMusic()"><i class="layui-icon layui-icon-search"></i></button>
        </div>
        <table class="layui-table">
            <thead>
            <tr>
                <th>ID</th>
                <th>歌曲ID</th>
                <th>歌曲名</th>
                <th>图片</th>
                <th>歌曲时长</th>
                <th>歌手ID</th>
                <th>歌手名</th>
                <th>类型</th>
                <th>关键词</th>
                <th>操作</th>
            </tr>
            </thead>
            <tbody>
            <tr v-for="(music,index) in list">
                <td v-html="music.id"> </td>
                <td v-html="music.music_id"></td>
                <td v-html="music.music_name"></td>
                <td><img :src="music.pic_url" alt="" width="50px"></td>
                <td>@{{music.music_time}} s</td>
                <td v-html="music.singer_id"></td>
                <td v-html="music.singer_name"></td>
                <th v-html="music.search_type_name"></th>
                <td v-html="music.s"></td>
                <th>
                    <div class="layui-btn-group">
                        <button class="layui-btn layui-btn-xs"><i class="layui-icon layui-icon-play" @click="play(index)"></i></button>
                        <button class="layui-btn layui-btn-xs"><i class="layui-icon layui-icon-search"></i></button>
                    </div>
                </th>
            </tr>
            </tbody>
            <tfoot>
            <tr v-show="is_null">
                <td colspan="10" style="text-align: center">暂无数据</td>
            </tr>
            <tr>
                <td colspan="10" id="page" style="text-align: center"></td>
            </tr>
            </tfoot>
        </table>
    </div>
@endsection
{{--js--}}
@section('js')
    <script type="text/javascript">
        layui.config({
            base:'/js/admin/'
        }).use('music')
    </script>
@endsection

更多详情参考 网易云音乐(Cloudmusic)API - 知乎

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值