关于music:Listen1优质的听歌软件
在生活中,你是否为如下的问题而感到困扰?- 我是网X云音乐的会员,然而我想听周杰伦- 可周杰伦歌的版权网X云没有啊- 我是QX音乐的会员,然而我想听华晨宇- 可华晨宇歌的版权QX没有啊这个利用就痛快的解决了这样听歌人的痛点它还有一个很不便的性能,反对登陆账号(尽管不反对编辑歌单) 不多说了,上图! 最初,附上下载链接官网github仓库如果感觉不错,无妨举荐给你身边喜爱音乐的敌人。
在生活中,你是否为如下的问题而感到困扰?- 我是网X云音乐的会员,然而我想听周杰伦- 可周杰伦歌的版权网X云没有啊- 我是QX音乐的会员,然而我想听华晨宇- 可华晨宇歌的版权QX没有啊这个利用就痛快的解决了这样听歌人的痛点它还有一个很不便的性能,反对登陆账号(尽管不反对编辑歌单) 不多说了,上图! 最初,附上下载链接官网github仓库如果感觉不错,无妨举荐给你身边喜爱音乐的敌人。
前端LRC歌词解析播放插件写音乐播放器的时候,做了显示歌词的功能,而歌词内容为lrc格式。为了显示歌词,就参考其他库根据自己的想法实现了一个基于JavaScript的lrc文件解析库。本项目已开源,地址:https://github.com/lyswhut/lr…demo地址:https://lyswhut.github.io/lrc…安装方法本项目已发布到 npm 上,所以可用 npm 安装或者直接引入文件的方式使用。安装方法1使用 npm 安装:npm install lrc-file-parser -S导入:// importimport Lyric from ’lrc-file-parser’安装方法2直接引入文件的方式<script src="./lrc-file-parser.min.js"></script>两种方法根据实际情况2选1即可。使用方法var lrc = new Lyric({ onPlay: function (line, text) { // 歌词播放时的回调 console.log(line, text) // line 是当前播放行 // text 是当前播放的歌词 }, onSetLyric: function (lines) { // 监听歌词设置事件。当设置歌词时,歌词解析完毕会触发此回调。 console.log(lines) // lines 是一个数组[{time,text}],里面包含播放时间及对应的歌词文本。 }, offset: 150 // 歌词偏移时间单位毫秒, 默认 150 ms})lrc.setLyric(lyricStr) // 设置歌词,此处传入lrc文件的文本内容 // 注意:设置歌词将自动暂停歌词播放lrc.play(30000) // 播放歌词,传入开始播放时间,30000是播放时间,单位:mslrc.pause() // 暂停播放歌词好用的话请在GitHub给个star哦~
electron-vue 窗口的mini模式electron中打开新窗口通常就是新开一个html页面,vue是单页面,只有一个入口文件,它的路由跳转是H5的location;设想新增入口文件,就是新加html,但这样失去了单页面的作用,vue也无法在两个不同html中运行方法我个人的方法是子窗口打开同一个html文件,但路由地址不同为什么要这样,直接拖曳缩小不行吗?不行为了布局这些,设置了窗口最小大小,设置了以后,窗口的setSize方法中宽高小于最小宽高是无效的,mini化也就只能新建窗口了实现// main/index.jsfunction createWindow () { // 初始化窗口就是mainWindow,省略 BrowserWindow.mainWindow = mainW; // 一定要加,用于判断是否新建子窗口,否则会不断新建 BrowserWindow.miniWindow = null;}// 监听窗口状态ipc.on(‘winreduction’, (event, state) => { // 监听从mini窗口变回原来大小 if(state == ‘mini’) { // 主要是这里,发送一个窗口要从mini模式还原到原来大小,事件从mini.vue发出 event.sender.send(‘full’, ‘reduction’) } else { mainWindow.unmaximize(); } event.sender.send(‘statechange’, ‘reduction’);})// app.vue// 在appvue里新建子窗口const electron = require(“electron”);const ipc = electron.ipcRenderer;const currWin = electron.remote.getCurrentWindow();import { setTimeout, clearTimeout, setImmediate } from “timers”;let miniWindow = null;function createMiniWin() { let miniWindow = new electron.remote.BrowserWindow({ width: 280, height: 48, frame: false, titleBarStyle: “hidden”, // macOs useContentSize: true, show: false, center: true, resizable: false, webPreferences: { webSecurity: false // 禁用同源策略 } }); let winURL = window.location.href; let uri = winURL + winURL.substring(0, winURL.indexOf("#") + 1); if (/#/.test(uri)) { uri += “mini”; } else { uri += “#/mini”; } miniWindow.loadURL(uri); miniWindow.once(“ready-to-show”, () => { miniWindow.hide(); // mainWindow.setAlwaysOnTop(true, ‘status’); // 总是最顶层 if (miniWindow.moveTop) { miniWindow.moveTop(); } }); miniWindow.on(“closed”, () => { miniWindow = null; }); return miniWindow;}// 这就是在index里设置BrowserWindow.miniWindow的原因,这样就会只创建一次if (electron.remote.BrowserWindow.miniWindow === null) { miniWindow = electron.remote.BrowserWindow.miniWindow = createMiniWin(); ipc.send(“miniCreate”, miniWindow);}export default { name: ‘app’, data() { return { state: “reduction”, } }, mounted() { ipc.on(“statechange”, (event, data) => { this.state = data; mainWindow: electron.remote.BrowserWindow.mainWindow, miniWindow: electron.remote.BrowserWindow.miniWindow, }); ipc.on(“full”, (event, state) => { this.state = state; /* 这个是一个坑,本来我设想是路由跳转回来,但是会导致窗口出现延迟,就像是打开网页一样的感觉 因为是边学边用,没有看过全部API,我找了半天,终于找到一个goBack方法,用于回退,没有延迟 感觉和原生一样 */ this.mainWindow.webContents.goBack(); // mini隐藏,main显示 this.miniWindow.hide(); this.mainWindow.show(); }); }, // 省略 watch: { state(old, news) { if (old == “mini”) { // 点击缩小按钮,路由跳转到mini,并且将主窗口隐藏,mini窗口显示 this.$router.push({ name: “mini” }); this.miniShow(); } } }}// mini.vueconst electron = require(“electron”);const remote = electron.remote;const ipc = electron.ipcRenderer;export default { name: “mini”, data() { return { mainWindow: remote.BrowserWindow.mainWindow, }; }, created() {}, methods: { close() { ipc.send(“winclose”); }, full() { ipc.send(“winreduction”, “mini”); // 发出要从mini窗口变回原来大小 } }};效果如图mini还没画预告一下网上的electron实现播放器,我找了半天也没有如何mini化的,花了不少时间接下来是另一个问题,读取本地的文件夹,就是上图打开本地文件那个如何读取音乐并获取它的时长,信息,作者,专辑呢,我利用了ffmpeg这个模块但随之而来的是ffmpeg必须要安装才能使用,我们最终打包不同客户端,不可能强制客户安装其它软件才能用我们的应用,网上也没什么解决实例,我不会c,c++什么的具体方法下一篇 ...
MusicBrainz 没有/没有/没有 复杂的OAuth认证,直接访问即可!MusicBrainz WebAPI目前Musicbrainz提供两种WebAPI:XML Web ServiceJSON Web Service (Beta)Rate LimitingMusicBrainz 的API一般都无用户权限认证,允许任何匿名访问,直接打开浏览器访问即可。但是,如果为了增加访问限制的数量,官方建议在request请求的头部加上user-agent。参考:Rate Limiting格式如下:User-Agent: <AppName>/<version> ( contact-email )or User-Agent: <AppName>/<version> ( contact-url )etc.,User-Agent: MyAwesomeTagger/1.2.0 ( http://myawesometagger.example.com )User-Agent: MyAwesomeTagger/1.2.0 ( me@example.com )根据user-agent的种类,限制情况如下:使用python-musicbrainz/0.7.3库访问:限制50次/秒。完全匿名访问:限制50次/秒。其它访问:Source IP address:取决于访问速率,一旦过高,将被完全限制,直到速度降为到1次/秒。Global: 300次/秒。MusicBrainz XML APIMusicbrainz的WebAPI是XML格式的。目前v1版本正准备被淘汰,v2版本也很好用。参考官方:Development / XML Web Service / Version 2查询格式:http://musicbrainz.org/ws/2/<资源>/?query=<属性1>:<值> AND <属性2>:<值>&limit=<显示数>如,搜索artist:http://musicbrainz.org/ws/2/artist/?query=name:bigbang%20AND%20country:NO&limit=10如,搜索album:http://musicbrainz.org/ws/2/release/?query=name:edendale如,搜索track:http://musicbrainz.org/ws/2/recording/?query=name:pristine具体查询详细参考:Development / XML Web Service / Version 2 / Search关于XML解析Python:xmltodictlxmlxpat…经过试用,目前尚未找到能“正确”解析的工具,总是出现一些问题。MusicBrainz JSON API (Beta)参考官方:Development/JSON Web ServiceMusicbrainz提供了一个正在beta开发中的JSON API,要远方便与XML。因为XML的解析实在是太麻烦了。具体的方法是:在v2版本的API上加上一个fmt参数即可。格式为:..&fmt=json示例:http://musicbrainz.org/ws/2/artist/?query=name:bigbang&fmt=json注意:目前JSON API正在开发中,所以是unstable的。inc参数参考:inc - Development / XML Web Service / Version 2当你request API的时候,默认返回的数据很多都是不全的。MusicBrainz可以让你有选择性的增加返回的数据。需要用到的就是url里的inc参数。格式为…&inc=AAA+BBB+CCC示例:http://musicbrainz.org/ws/2/recording/?query=bigbang&inc=artist-credits+isrcs+releases&fmt=jsonscore属性在我们请求WebAPI搜索的时候,每个返回的搜索结果都会有一个score属性。这个是匹配度的值,100分,99分,65分等等。如果搜索的信息完全匹配,则为100。这个搜索算法,是Lucene引擎的算法。参考:More information on the “Score” attribute in the search of musicbrainz参考:Lucene scoring not accurateMusicBrainz Python SDK注意:目前python-musicbrainz项目是调用的v1版本API,显示的数据不是很全。参考官方Github:alastair/python-musicbrainzngs参考官方API文档:musicbrainzngs 0.6 documentation »参考官方示例:Usage安装:pip install musicbrainzngs登录:import musicbrainzngs as mb# 登录mb.auth(“用户名”, “密码”)# 随便写个app信息mb.set_useragent(“Example music app”, “0.1”, “http://example.com/music")# [可选] 指定查询服务器mb.set_hostname(“beta.musicbrainz.org”)就是这么简单,没有复杂的Oauth验证。常用操作:# 搜索一个artistartists = mb.search_artists(artist=“big bang”, type=“group”, country=“Norway”)MusicBrainz Database 数据库下载使用MusicBrainz的数据库是完全免费公开下载使用的。参考官方说明:MusicBrainz Database参考官方说明:MusicBrainz Database/Download参考官方说明:MusicBrainz Database / SchemaMusicBrainz数据库结构图(关系型):使用方法有很多种:Virtual Machine 虚拟机JSON文件Postgresql数据库安装Postgresql数据库参考官方:Database Installation下载数据库的方式有http、ftp、rsync等,其中最方便的是http。下载地址一般为:http://ftp.musicbrainz.org/pu…要查看最新日期为什么,可以直接到http://ftp.musicbrainz.org/pub/musicbrainz/data/fullexport查看下面的子目录有哪些。Postgresql数据库下载使用:# 下载最新日期的数据库文件 “mbdump.tar.bz2” 大约2.7GBwget http://ftp.eu.metabrainz.org/pub/musicbrainz/data/fullexport/20181205-001547/mbdump.tar.bz2tar -xjvf mbdump.tar.bz2cd mbdump/mkdir ../finished# 创建空数据库createdb -U postgres –owner=postgres –encoding=UNICODE db_musicbrainz# 登录数据库psql -U postgres db_musicbrainz\i admin/sql/CreateTables.sqlBEGIN\q# 导入数据for FILE in * ; do cmd=”\copy $FILE from ./$FILE" echo $cmd | psql -U postgres db_musicbrainz && mv $FILE ../finished/done echo date Donecd .. ...
参考官网:http://developers.music-story…Music Story 是一个非开源收费版的类似MusicBrainz的音乐库。它的最大优点是能提供各种单曲、专辑、歌手的Connector,即显示资源在各种平台上的链接。比如有一首歌,它能提供API告诉你它在Youtube、Spotify、MusicBrainz等平台的资源链接。有了这个Connector后,我们就可以做很多有趣的事情。但是这个API是半收费的,即免费版用户每个月只能request 2000次。显然有点少。所以我只打算用它的connector,而其它所有信息还是以免费的MusicBrainz为主。注册开发者身份注册开发者身份:http://user.music-story.com/这个API的注册极其简单,注册个用户,就能立马得到oAuth 1.0的两套key-token密钥对。显示token的地址为:http://user.music-story.com/c…第一个Consumer密钥对,密码自动会发到邮箱。第二个Access密钥对,要手动点一下生成才行。全部生成好,最好复制到本地文本里面,以供下次使用。授权验证Music Story采用Oauth 1.0验证,需要这些步骤:通过两套secret密钥向http://api.music-story.com/oauth/request_token提交授权申请获取oauth_signature值每次查询API时,都在URL中加入&oauth_token=<VOTRE TOKEN D’ACCES>&oauth_signature=<SIGNATURE OAUTH>这两个参数即可。在Postman中测试的话很方便,无需复杂操作即可完成。在Authentication页面选择Oauth 1.0方式授权,填入密钥信息即可。读取API按歌名搜索一首歌:http://api.music-story.com/en/track/search?title=now is not a good time结果会返回它的ID等信息。不包括详细信息。比如一首歌的id是22739747299518299,那么搜索它的信息:http://api.music-story.com/en/track/22739747299518299搜索一首歌的conenctor,比如youtube:http://api.music-story.com/en/track/22739747299518299/youtube同理,albums和Artists也都是这么操作。