Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >网页音乐播放器

网页音乐播放器

作者头像
全栈程序员站长
发布于 2022-07-02 05:58:31
发布于 2022-07-02 05:58:31
3.8K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

这个播放器是利用qq音乐的api实现了音乐的播放,搜索,歌词同步。

MusicUtil.java主要代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tc.musicplay.utils;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Pattern;


import org.apache.commons.io.FileUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.show.api.ShowapiRequest;
import com.tc.musicplay.domain.MusicInfo;
import com.tc.musicplay.domain.MusicLrc;


/**
 * 
 */

/**
 * @ClassName: MusicUtil
 * @Description: TODO
 * @author Simple 
 * @date 2017-5-16 上午10:02:19
 *
 */
public class MusicUtil {

	/**
	 * 
	* @Title: searchSongs
	* @Description: 该类是通过歌手,歌名获取音乐列表
	* @param @param keyWord 搜索的关键词
	* @param @param count 每页的个数
	* @param @param page 
	* @param @return    设定文件
	* @return ArrayList<Map<String, String>>    返回类型
	* @throws
	 */
	public static ArrayList<MusicInfo> searchSongs(String keyWord,int count,int page){
		String url="http://s.music.qq.com/fcgi-bin/music_search_new_platform?t=0&n="+count+"&aggr=1&cr=1&loginUin=0&format=json&inCharset=GB2312&outCharset=utf-8¬ice=0&platform=jqminiframe.json&needNewCode=0&p="+page+"&catZhida=0&remoteplace=sizer.newclient.next_song&w="+keyWord;
		ArrayList<MusicInfo> songArrayList=new ArrayList<MusicInfo>();
		String json=HttpUtil.sendGet(url);
		JSONObject rootObject=JSONObject.parseObject(json);
		JSONObject dataObject=rootObject.getJSONObject("data");
		JSONObject songObject=dataObject.getJSONObject("song");
		JSONArray songList=songObject.getJSONArray("list");
		for (int i = 0; i < songList.size(); i++) {
			JSONObject song=songList.getJSONObject(i);
			String f[]=song.getString("f").split("\\|");
			if(f.length>=3){
			MusicInfo musicInfo=new MusicInfo();
			String songId=f[0];
			String imageId=f[f.length-3];
			String songName=song.getString("fsong");
			String singer=song.getString("fsinger");
			String singer2=song.getString("fsinger2");
			musicInfo.setSongUrl(getSongUrl(songId));
			musicInfo.setImageUrl(getImageUrl(imageId));
			musicInfo.setSongName(songName.trim());
			musicInfo.setSinger(singer);
			musicInfo.setSinger2(singer2);
			musicInfo.setSongId(songId);
			songArrayList.add(musicInfo);
			}
			
		}
		return songArrayList;
	}
	/**
	 * 
	* @Title: getSongUrl
	* @Description: 得到歌曲地址
	* @param @param songId
	* @param @return    设定文件
	* @return String    返回类型
	* @throws
	 */
	public static String getSongUrl(String songId){
		return "http://ws.stream.qqmusic.qq.com/"+songId+".m4a?fromtag=46";
	}
	/**
	 * 
	* @Title: getImageUrl
	* @Description: 得到图片的地址
	* @param @param imageId
	* @param @param width
	* @param @return    设定文件
	* @return String    返回类型
	* @throws
	 */
	public static String getImageUrl(String imageId){
		String first=imageId.substring(imageId.length()-2,imageId.length()-1);
		String second=imageId.substring(imageId.length()-1);
		return "http://i.gtimg.cn/music/photo/mid_album_300/"+first+"/"+second+"/"+imageId+".jpg";
	}
	/**
	 * 
	* @Title: getSongLrcUrl
	* @Description: 得到歌词的地址
	* @param @param songId
	* @param @return    设定文件
	* @return String    返回类型
	* @throws
	 */
	public static String getSongLrcUrl(String songId){
		return "http://music.qq.com/miniportal/static/lyric/"+Integer.parseInt(songId)%100+"/"+songId+".xml";
		
	}
	/**
	 * 
	* @Title: downloadSong
	* @Description: 该类是下载歌曲
	* @param @param songId 歌曲的id
	* @param @param destFile 文件类型为mp3
	* @param @throws Exception    设定文件
	* @return void    返回类型
	* @throws
	 */
	public static void downloadSong(String songId,File destFile) throws Exception{
		String songUrl=getSongUrl(songId);
		FileUtils.copyURLToFile(new URL(songUrl), destFile);
		
	}
	public static byte[] downloadSong(String songId){
		
		return null;
	}
	/**
	 * 
	* @Title: downLoadLrc
	* @Description: 该方法是下载歌词
	* @param @param songId
	* @param @param destFile 文件类型为xml
	* @param @throws Exception    设定文件
	* @return void    返回类型
	* @throws
	 */
	public static void downLoadLrc(String songId,File destFile) throws Exception{
		String lrcUrl=getSongLrcUrl(songId);
		FileUtils.copyURLToFile(new URL(lrcUrl), destFile);
	}
	
	private static ArrayList<MusicLrc> putInfo(String lrc){
		String lines[]=lrc.split("\n");
		ArrayList<MusicLrc> lrcList=new ArrayList<MusicLrc>();
		
		Integer offset=0;
		for (int i = 0; i < lines.length; i++) {
			String reg = "\\[(\\d{2}:\\d{2}\\.\\d{2})\\]";  
            // 编译  
            Pattern pattern = Pattern.compile(reg); 
			
			if(lines[i].startsWith("[offset")){
				offset=Integer.parseInt(lines[i].substring(8,lines[i].length()-1));
				System.out.println(offset);
			}else if(pattern.matcher(lines[i]).find()){
				String lrcText=lines[i].substring(10);
				if(lrcText!=null&&!lrcText.equals("")){
					MusicLrc musicLrc=new MusicLrc();
					String time=lines[i].substring(1,9);
					String minute=time.substring(0,2);
					String second=time.substring(3,5);
					String millisecond=time.substring(6);
					int key=(Integer.parseInt(minute)*60+Integer.parseInt(second))*1000+Integer.parseInt(millisecond)*10-offset;
					musicLrc.setTime(key);
					musicLrc.setLrcLine(lrcText);
					lrcList.add(musicLrc);
				}	
			}
		}
		return lrcList;
	}
	public static ArrayList<MusicLrc> getOnlineLrcMap(String songId) throws DocumentException{
		SAXReader reader=new SAXReader();
		String lrcUrl=getSongLrcUrl(songId);
		System.out.println(lrcUrl);
		String result=HttpUtil.sendGet(lrcUrl);
		ByteArrayInputStream byteArrayInputStream=null;
		try {
			byteArrayInputStream = new ByteArrayInputStream(result.getBytes("GB2312"));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		Document document=reader.read(byteArrayInputStream);
		Element element=document.getRootElement();
		String lrc=element.getData().toString();
		return putInfo(lrc);
	}
	public static ArrayList<MusicLrc> getLrcMapOnAliyun(String songId){
		ShowapiRequest req = new ShowapiRequest(
				"https://ali-qqmusic.showapi.com/song-word?musicid="+songId,"d5175d863d8c41fba83bc40ca41c6596");
		String json= req.get();
		json=json.replaceAll(":", ":").replaceAll(".", ".").replaceAll("
", "\n").replaceAll(" ", " ");
		System.out.println(json);
		Map map = req.getRes_headMap();
		Iterator it = map.keySet().iterator();
		while (it.hasNext()) {
			Object k = it.next();
			System.out.println(k + "          " + map.get(k));
		}
		JSONObject jsonObject=JSONObject.parseObject(json);
		String lrc=jsonObject.getJSONObject("showapi_res_body").getString("lyric");
		System.out.println(lrc);
		return putInfo(lrc);
	}
	public static ArrayList<MusicLrc> getLrcMap(File file) throws Exception{
		
		SAXReader reader=new SAXReader();
		Document document=reader.read(new FileInputStream(file));
		Element element=document.getRootElement();
		String lrc=element.getData().toString();
		return putInfo(lrc);
	}
}

运行截图

完整项目的下载地址

去下载

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147933.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
开源音乐下载神器XMusicDownloader更新,支持歌单一键下载,支持无损音乐
开源音乐下载神器XMusicDownloader更新啦,新增网易、腾讯音乐歌单歌曲、歌手歌曲、专辑歌曲一键下载,同时支持下载flac无损音乐。
JadePeng
2019/09/29
29K0
开源音乐下载神器XMusicDownloader更新,支持歌单一键下载,支持无损音乐
安卓开发个人小作品(3) – 多功能音乐播放器[通俗易懂]
这次介绍一个多功能音乐播放器,记得是大二那年寒假写的,实现的主要功能就是音乐播放,带进度条控制,扫描本地音乐,上一曲下一曲,播放类型(单曲循环,顺序播放,随机播放),APP主题换肤,背景图更换等,功能都比较基础,基本上如果你不会的话,跟着我的思路,应该都是能实现的,预计会在以后加入歌词的功能。
全栈程序员站长
2022/09/13
1.8K0
《Java从入门到放弃》框架入门篇:Struts2的常用基本标签
说起Struts2中的标签,这真是个好东西,为什么呢? 因为··························就算你会这玩意,别人也可能会说,这玩意居然还有人学,用JSTL和EL表达式不就行了么! 还有一种情况。如果你不会,你可以理直气状的说:这是什么玩意啊,完全没用!我会JSTL标签和EL表达式就行了。 好吧,上面都是玩笑之言,接下来,我们进入正题,接下来介绍几个大家熟悉的标签 至于不熟悉的标签·················,我们就不学了。为什
十方上下
2018/06/14
4640
Android MediaPlayer 音乐播放器扫描 本地音乐、上一曲、下一曲切歌、播放本地音乐
项目请在真机(自己的手机)上测试运行,因为我不喜欢用虚拟机。 为了不浪费您的时间,先看一下运行的效果图, 一进去先进行音乐扫描,然后列表展示出来,点击即可播放。
晨曦_LLW
2020/09/25
3.1K0
java小工具,使用Swing展示左树右表结构
java -Dfile.encoding=utf-8 -jar your.jar pause
JQ实验室
2022/02/10
9270
WebSocket系列之的网页端即时通讯实现
本博客介绍基于html5的Websocket网页即时通讯技术,前端开发采用ExtJS前端框架 JavaEE框架:Mybatis、SpringMVC 先去官网下载ExtJS框架的资料文件: https://www.sencha.com/products/extjs/evaluate/ 可以参考中文翻译过来的官网查看API: http://extjs-doc-cn.github.io/ext4api/ 下载集成的jar:
SmileNicky
2022/05/07
8720
WebSocket系列之的网页端即时通讯实现
手把手教你如何微信公众号开发「建议收藏」
最近的话,发现微信开发其实也有很多挺有意思的地方,比如最近很火的一款游戏“跳一跳”,也让我如此着迷。。但是,今天我所要讲的并不是对于小程序的开发,而是要说一下,关于微信开发的另外一个内容,那就是微信公众号。。
全栈程序员站长
2022/09/25
3.6K0
手把手教你如何微信公众号开发「建议收藏」
简单的安卓网络音乐视频播放器app
学习安卓开发时做的一个小demo,知识点包括:intent、UI、界面切换、API调用、播放器调用、内部存储、list控件等。
小锋学长生活大爆炸
2022/05/09
2.1K0
简单的安卓网络音乐视频播放器app
基于Java爬取微博数据(五) 补充微博正文列表图片 or 视频 内容
在通过对微博正文内容中的图片 or 视频内容进行分析后,图片 or 视频 链接是可以直接通过 Java 代码下载或者转存的,那么这样就可以补充我们在 【基于Java爬取微博数据(一) 微博主页正文列表数据】 时缺失的图片 or 视频信息了,当然,如果你的需求并不需要转存微博正文列表内容中的图片 or 视频的话,那么你就无需进行下面的操作了。在开始进行微博主页正文列表数据 补充 图片 or 视频内容之前,先来分析一下获取到的微博正文列表数据的内容。
六月的雨在Tencent
2024/09/25
2810
Android开发笔记(六十二)HTTP数据格式的解析
android有两种主流的json解析方案,一种是sdk自带的由Google提供的json(包名前缀为org.json),另一种是Alibaba提供的第三方jar包fastjson(包名前缀为com.alibaba.fastjson)。
aqi00
2019/01/18
1.4K0
Mapreduce任务实现邮件监控
Mapreduce任务实现邮件监控     这里主要使用Java自带邮件类实现Mapreduce任务的监控,如果Mapreduce任务报错则发送报错邮件。Mapreduce的报错信息通过hdfs中的日志获取,里面的报错日志是json格式,这里先将json转换成xml格式然后再发送到邮件。具体代码如下 import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import j
闵开慧
2018/03/30
7380
Android 音乐APP(一)扫描本地音乐
  这个项目纯粹的就是心血来潮,打算写一个,写作的方式和天气APP类似,把博客当成开发笔记吧,感兴趣可以跟着看,OK,新建一个项目。
晨曦_LLW
2020/10/26
4.5K0
Android 音乐APP(一)扫描本地音乐
java saxreader 字符串_Java SAXReader.read方法代碼示例
本文整理匯總了Java中org.dom4j.io.SAXReader.read方法的典型用法代碼示例。如果您正苦於以下問題:Java SAXReader.read方法的具體用法?Java SAXReader.read怎麽用?Java SAXReader.read使用的例子?那麽恭喜您, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類org.dom4j.io.SAXReader的用法示例。
全栈程序员站长
2022/06/28
5540
Java XML解析工具类
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/162472.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/16
1.3K0
Java爬取并下载酷狗TOP500歌曲
技术文章第一时间送达! 来源:my.oschina.net/gllfeixiang/blog/2995570?p=1 是这样的,之前买车送的垃圾记录仪不能用了,这两天狠心买了好点的记录仪,带导航、音乐
良月柒
2019/03/20
1.2K0
Java爬取并下载酷狗TOP500歌曲
从零开发一个定制版音乐播放器,女朋友不就有了吗?
今天再带着大家利用 1 小时,码个定制版的音乐播放器出来,想想都刺激。学会这玩意,距离大伙找到女朋友又进了一步。
陈大奇
2021/07/23
5170
做一个简易简单音乐播放器
那天夜里,我戴上耳机准备听首老歌,却猛然发现自己手机里找不到一个既好看又好用的小型音乐播放器 App。主流播放器不是太臃肿,就是界面审美老旧。突然就冒出一个念头——干脆自己写一个简约现代、功能完善的小型音乐播放器吧。
繁依Fanyi
2025/05/14
1780
_Android 课设之个人音乐播放器
由于时代快速发展,各种各样的音乐播放器层出不穷,此时需要一个可以根据个人爱好来播放的音乐播放器就尤为重要,因此我特意制作了一个根据自己喜好的音乐播放器,只需要把音乐文件放进制定的目录下即可。
会洗碗的CV工程师
2023/11/23
3170
_Android 课设之个人音乐播放器
019.数据交换格式:Json、XML
数据交换格式中,最核心的就是Json和XML。 其中,Json是一种轻量级数据交换格式,XML是一种重量级的数据交换格式。 相比于xml这种数据交换格式来说, 因为解析xml比较的复杂,而且需要编写大段的代码, 所以客户端和服务器的数据交换格式往往通过JSON来进行交换。
qubianzhong
2018/11/21
7250
八、jQuery的QQ音乐播放器
自定义滚动条使用了一个jQuery插件jQuery custom content scroller。利用这个插件可以轻松设置滚动条样式。
Dreamy.TZK
2020/06/22
4.6K0
推荐阅读
相关推荐
开源音乐下载神器XMusicDownloader更新,支持歌单一键下载,支持无损音乐
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验