vue仿网易云音乐播放器界面的简单实现过程

由于工作项目的需要,需要使用到歌曲播放,参考多方资料,写了一个仿网易云音乐播放界面,能完整的实现音乐播放功能。

vue仿网易云音乐播放器界面的简单实现过程_第1张图片

vue仿网易云音乐播放器界面的简单实现过程_第2张图片

前端简单的使用vue组件和audio标签实现了播放器界面,后端则是调用网易云的API获取对应的歌曲信息。

vue仿网易云音乐播放器界面的简单实现过程_第3张图片

 废话不多说上代码

歌曲播放界面(musicPlay.vue)



 

歌词部分(lyricScroll.vue)


 

时间转换的JS(timeConversion.js)

/**
 * @author lyq
 * @time 2021年11月21日21:08:48
 *
 * 秒值转时分秒
 * @name TimeToString
 * @example 秒值转时分秒
 * @param {String} seconds 秒
 */
const TimeToString = (seconds) => {
    let param = parseInt(seconds);
    let hh = "",
        mm = "",
        ss = "";
    if (param >= 0 && param < 60) {
        param < 10 ? (ss = "0" + param) : (ss = param);
        return "00:" + ss;
    } else if (param >= 60 && param < 3600) {
        mm = parseInt(param / 60);
        mm < 10 ? (mm = "0" + mm) : mm;
        param - parseInt(mm * 60) < 10 ?
            (ss = "0" + String(param - parseInt(mm * 60))) :
            (ss = param - parseInt(mm * 60));
        return mm + ":" + ss;
    }
}

基本前端代码都在这儿了,下面为后端的接口逻辑层代码

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : MusicServiceImpl
 * @description : [描述说明该类的功能]
 * @createTime : [2021/11/16 14:28]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2021/11/16 14:28]
 * @updateRemark : [描述说明本次修改内容]
 */
@Service
@Slf4j
public class MusicServiceImpl implements MusicService {
    @Autowired
    private Environment environment;
 
 
    /*
     * @version V1.0
     * Title: getMusicList
     * @author LiuYanQiang
     * @description 获取热歌榜随机二十首音乐信息
     * @createTime  2021/11/16 14:32
     * @param []
     * @return java.util.Map*/
    @Override
    public List> getMusicList() {
        JSONArray resultObject = null;
        //拼接URL发送对应的请求
        StringBuffer url = new StringBuffer();
        url.append("https://api.vvhan.com/api/rand.music?type=all&sort=热歌榜");
        //获取接口的返回值
        String body = HttpUtils.sendGet(url.toString());
        resultObject = JSONObject.parseArray(body);
        List> list = new ArrayList<>();
        for (int i = 0; i < resultObject.size(); i++) {
            HashMap map = new HashMap();
            JSONObject jsonObject = resultObject.getJSONObject(i);
            map.put("cover", JSONObject.parseObject(jsonObject.get("album").toString()).getString("picUrl"));
            map.put("artistsName", JSONObject.parseArray(jsonObject.get("artists").toString()).getJSONObject(0).getString("name"));
            map.put("name", jsonObject.getString("name"));
            map.put("id", jsonObject.getString("id"));
            list.add(map);
        }
        Random random = new Random();
        int num = random.nextInt(179) % (179 - 0 + 1) + 0;
        list = list.subList(num, num + 20);
        return list;
    }
 
    /*
     * @version V1.0
     * Title: getMusicURLInfo
     * @author LiuYanQiang
     * @description 获取音乐播放的URL信息
     * @createTime  2021/11/19 9:22
     * @param [Id——音乐Id]
     * @return java.util.List>*/
    @Override
    public Map getMusicURLInfo(String Id) {
        JSONObject resultObject = null;
        //拼接URL发送对应的请求
        StringBuffer url = new StringBuffer();
        url.append("https://api.vvhan.com/api/music?id=" + Id + "&type=song&media=netease");
        //获取接口的返回值
        String body = HttpUtils.sendGet(url.toString());
        resultObject = JSONObject.parseObject(body);
        HashMap map = new HashMap();
        //判断第三方给的音乐URL是否有效,无效则替换官方的URL
        if(this.isValid(resultObject.get("mp3url").toString())){
            map.put("id", resultObject.get("song_id").toString());
            map.put("name", resultObject.get("name"));
            map.put("artistsName", resultObject.get("author"));
            map.put("cover", resultObject.get("cover"));
            map.put("url", resultObject.get("mp3url"));
            map.put("lyric", this.getMusicLyricById(Id) != null ? this.getMusicLyricById(Id) : null);
        }
        else{
            map.put("id", Id);
            map.put("url", "https://music.163.com/song/media/outer/url?id="+Id+".mp3");
            map.put("lyric", this.getMusicLyricById(Id) != null ? this.getMusicLyricById(Id) : null);
        }
        return map;
    }
 
    /*
     * @version V1.0
     * Title: isValid
     * @author LiuYanQiang
     * @description 判断链接是否有效
     * @createTime  2021/11/20 10:23
     * @param [strLink——输入链接]
     * @return boolean
     * */
    public boolean isValid(String strLink) {
        URL url;
        try {
            url = new URL(strLink);
            HttpURLConnection connt = (HttpURLConnection) url.openConnection();
            connt.setRequestMethod("HEAD");
            String strMessage = connt.getResponseMessage();
            if (strMessage.compareTo("Not Found") == 0) {
                return false;
            }
            connt.disconnect();
        } catch (Exception e) {
            return false;
        }
        return true;
    }
 
    /*
     * @version V1.0
     * Title: getRandomFiveMusic
     * @author LiuYanQiang
     * @description 随机5首音乐,不能频繁调用,不然网易云接口回调异常
     * @createTime  2021/11/19 9:08
     * @param []
     * @return java.util.List>*/
    @Override
    public List> getRandomFiveMusic() {
        List> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            JSONObject resultObject = null;
            //拼接URL发送对应的请求
            StringBuffer url = new StringBuffer();
            url.append("https://api.vvhan.com/api/rand.music?type=json&sort=热歌榜");
            //获取接口的返回值
            String body = HttpUtils.sendGet(url.toString());
            resultObject = JSONObject.parseObject(body);
            JSONObject info = JSONObject.parseObject(resultObject.get("info").toString());
            HashMap map = new HashMap();
            map.put("id", info.get("id").toString());
            map.put("name", info.get("name"));
            map.put("artistsName", info.get("auther"));
            map.put("cover", info.get("picUrl"));
            map.put("url", info.get("mp3url"));
            map.put("lyric", this.getMusicLyricById(info.get("id").toString()) != null ? this.getMusicLyricById(info.get("id").toString()) : null);
            list.add(map);
            log.info("调用成功" + i + "次");
        }
        return list;
    }
 
    /*
     * @version V1.0
     * Title: getMusicLyricById
     * @author LiuYanQiang
     * @description 获取歌词信息
     * @createTime  2021/11/16 19:23
     * @param [Id——音乐Id]
     * @return java.lang.String*/
    @Override
    public String getMusicLyricById(String Id) {
        try {
            JSONObject resultObject = null;
            //拼接URL发送对应的请求
            StringBuffer url = new StringBuffer();
            url.append("https://music.163.com/api/song/media?id=" + Id);
            //获取接口的返回值
            String body = HttpUtils.sendGet(url.toString());
            resultObject = JSONObject.parseObject(body);
            if (resultObject.get("lyric").toString() != null) {
                return resultObject.get("lyric").toString();
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

总结

到此这篇关于vue仿网易云音乐播放器界面简单实现的文章就介绍到这了,更多相关vue网易云音乐播放器界面内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(vue仿网易云音乐播放器界面的简单实现过程)