网页音乐播放器

网页音乐播放器这是一款网页版的音乐播放器。这个播放器是利用QQ音乐的api实现了音乐的播放,搜索,歌词同步,音乐的下载。

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

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

MusicUtil.java主要代码

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);
	}
}

运行截图

网页音乐播放器网页音乐播放器

网页音乐播放器网页音乐播放器

网页音乐播放器

网页音乐播放器

网页音乐播放器

网页音乐播放器网页音乐播放器

完整项目的下载地址


去下载

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)
blank

相关推荐

  • python做微信回复机器人_python聊天机器人代码

    python做微信回复机器人_python聊天机器人代码下面这个小文章适合初学Python的童鞋哦~~~一个很好用的微信库:itchat拿使用图灵机器人设置自动回复,让机器人跟微信好友傻傻的聊天,机器人比小编还会聊天,无论是对美眉还是汉纸,上来就是爱!爱!爱!简直太辣眼睛!!!用它进行来调戏微信好友,简直6的一笔!(记住一条!千万不能对女票使用,遭遇一万点伤害)好啦,下面就来一起看一下如何使用吧!使用工具:itchat,req…

  • 工作流程引擎:流程引擎对比「建议收藏」

    工作流程引擎:流程引擎对比「建议收藏」一.简介工作流引擎LiteFlow 需要提前定义好执行流程,不支持分布式执行,支持xml,json,yml,支持逻辑执行AirFlow ***** 支持分布式算子执行,不支持java算子执行,支持pythonDolphinScheduler ***** Azkaban可以跨服务执行,跨平台执行,flow支持dsl语法Oozie managerhadoopjobs,大数据任务调度框架KettleServerFlowable 与Activiti非常类似A

    2022年10月20日
  • 网络编程socket原理_socket的基本概念和原理

    网络编程socket原理_socket的基本概念和原理一、客户机/服务器模式在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Servermodel)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式:首先服务器方要先启动,并根据请示提供相应服务:(过程如下)1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。2、等待客户请求到

    2022年10月10日
  • Java虚拟机(JVM)你只要看这一篇就够了![通俗易懂]

    1.Java内存区域与内存溢出异常1.1运行时数据区域根据《Java虚拟机规范(JavaSE7版)》规定,Java虚拟机所管理的内存如下图所示。1.1.1程序计数器内存空间小,线程私有。字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成如果线程正…

  • swig简介_swiping是什么意思

    swig简介_swiping是什么意思swig

    2022年10月23日
  • php strom教程,PhpStorm常用教程

    php strom教程,PhpStorm常用教程一、PhpStorm界面简化Ctrl+Shift+A查找快捷键ALT+1:关闭或打开左边项目二、PhpStorm几个最重要的快捷键快速查找文件:CTRL+SHIFT+N==>Shift+F显示文件有哪些方法:CTRL+F12==>Shift+F+M最近打开文件:CTRL+E查找方法名或类名:==>Shift+M三、PSR自动加载支…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号