Compare commits

...

4 Commits

Author SHA1 Message Date
hunlongyu
8c0e35e766 🎎 新增全局监听 2020-05-20 11:39:46 +08:00
hunlongyu
f94d00e36c 😂 官网链接 2020-05-18 09:47:11 +08:00
hunlongyu
c0c4d9ad88 🎊 更新Readme 2020-05-18 09:42:42 +08:00
hunlongyu
3afa38beb7 🎉 正式版v1.0.0发布 2020-05-18 09:26:08 +08:00
13 changed files with 1999 additions and 1810 deletions

View File

@@ -1,5 +1,9 @@
<p align="center">
<img src="https://i.loli.net/2020/05/07/9kLvPnWVCp7538c.png" >
<img width="128" src="https://i.loli.net/2020/05/07/9kLvPnWVCp7538c.png" >
</p>
<p align="center">
<a href="http://zyplayer.fun/" target="_blank">官网</a>
<a href="https://github.com/Hunlongyu/ZY-Player/issues" target="_blank">反馈</a>
</p>
<p align="center">
<img src="https://forthebadge.com/images/badges/built-with-love.svg">
@@ -18,18 +22,21 @@
<p>
## ZY Player
## ZY Player 资源播放器
1. 全平台支持. windows, mac, linux.
2. 12个视频源. 未来更新更多的视频源.
3. 新增历史播放记录, 并记录播放进度.
4. 新增分享功能. 一键分享海报图片.
5. 新增精简模式. 支持修改透明度.
6. 全新布局配色.
7. 新增多语言.
8. 下载功能 (最大资源网和OK资源网支持下载.)
9. 更详细的视频分类
10. 收藏夹同步更新视频追剧.(手动更新)
11. 后台自动更新
### 新版内测
新版本: v0.9.x 已开发完, 现进行内测, [点击查看内测公告](https://github.com/Hunlongyu/ZY-Player/issues/24)
[点击这里可以查看开发计划](https://github.com/Hunlongyu/ZY-Player/projects/3).
大家有什么新的需求建议欢迎踊跃提出[点击这里提意见](https://github.com/Hunlongyu/ZY-Player/issues/14)
觉得软件不错的, 请点击 star 收藏一波呀~
觉得软件不错的, 点击右上角 star 收藏关注一波呀~
<img height="30" src="https://i.loli.net/2020/05/09/cNnvGobekWEqfjZ.jpg">
#### 下载:
@@ -39,9 +46,22 @@
2. [蓝奏云 -- 快速下载](https://www.lanzous.com/b04s6a3re) 密码:95px
#### 截图:
![001.png](https://i.loli.net/2020/04/28/T3YZvStwNQJ5aHy.png)
![003.png](https://i.loli.net/2020/04/28/2xYw9nIyWSZ5Rsr.png)
![002.png](https://i.loli.net/2020/04/28/sxnY28hgFcpUrb9.png)
1. 浏览 ⇣ ↓
![01浏览.png](https://i.loli.net/2020/05/18/MshDLnXq2CTpoBy.png)
2. 搜索 ⇣ ↓
![02搜索.png](https://i.loli.net/2020/05/18/kAKQpLeRJUID5d6.png)
3. 详情 ⇣ ↓
![03详情.png](https://i.loli.net/2020/05/18/s7gUj6unEfyYb4Z.png)
4. 播放 ⇣ ↓
![04播放.png](https://i.loli.net/2020/05/18/WqgnOw3mHd6e5uU.png)
5. 收藏 ⇣ ↓
![05收藏.png](https://i.loli.net/2020/05/18/bhIgeGMTPWmrdYi.png)
6. 白色主题皮肤 ⇣ ↓
![06白色.png](https://i.loli.net/2020/05/18/UgiVZ89dhkuxDBI.png)
7. 绿色主题皮肤 ⇣ ↓
![07绿色.png](https://i.loli.net/2020/05/18/4d2UnFRECm7vyJQ.png)
8. 粉色色主题皮肤 ⇣ ↓
![08粉色.png](https://i.loli.net/2020/05/18/PLlEfzd8mSC9vMW.png)
### 重要:
所有资源来自网上, 该软件不参与任何制作, 上传, 储存, 下载等内容. 该软件仅供学习参考, 请于安装后24小时内删除.

View File

@@ -1,6 +1,6 @@
{
"name": "zy",
"version": "0.9.37",
"version": "1.0.4",
"private": true,
"author": {
"name": "Hunlongyu",
@@ -33,8 +33,8 @@
"vue": "^2.6.11",
"vue-i18n": "^8.17.0",
"vuex": "^3.1.3",
"xgplayer": "^2.6.20",
"xgplayer-hls.js": "^2.2.0"
"xgplayer": "^2.6.24",
"xgplayer-hls.js": "^2.2.2"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.3.0",
@@ -44,7 +44,7 @@
"@vue/eslint-config-standard": "^5.1.2",
"babel-eslint": "^10.1.0",
"babel-plugin-component": "^1.1.1",
"electron": "^8.2.5",
"electron": "^8.3.0",
"eslint": "^6.7.2",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-node": "^11.1.0",

View File

@@ -93,7 +93,7 @@
width: 120px;
}
&.operate{
width: 120px;
width: 170px;
}
}
}
@@ -133,7 +133,7 @@
width: 120px;
}
&.operate{
width: 120px;
width: 170px;
}
}
}

View File

@@ -8,9 +8,8 @@ import {
import path from 'path'
import { autoUpdater } from 'electron-updater'
const isDevelopment = process.env.NODE_ENV !== 'production'
const globalShortcut = require('electron').globalShortcut
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let win
let mini
@@ -22,7 +21,7 @@ function createWindow () {
width: 1080,
height: 720,
frame: false,
resizable: false,
resizable: true,
transparent: true,
webPreferences: {
webSecurity: false,
@@ -128,6 +127,32 @@ if (!gotTheLock) {
// 创建 win, 加载应用的其余部分, etc...
app.on('ready', () => {
globalShortcut.register('CommandOrControl+right', function () {
if (win) {
win.webContents.send('next', 0)
}
if (mini) {
mini.webContents.send('next', 0)
}
})
globalShortcut.register('CommandOrControl+left', function () {
if (win) {
win.webContents.send('prev', 0)
}
if (mini) {
mini.webContents.send('prev', 0)
}
})
globalShortcut.register('CommandOrControl+up', function () {
if (mini) {
mini.webContents.send('up', 0)
}
})
globalShortcut.register('CommandOrControl+down', function () {
if (mini) {
mini.webContents.send('down', 0)
}
})
if (!process.env.WEBPACK_DEV_SERVER_URL) {
createProtocol('app')
}

View File

@@ -59,6 +59,7 @@
<span class="btn" @click.stop="playEvent(i)">{{$t('play')}}</span>
<span class="btn" @click.stop="starEvent(i)">{{$t('star')}}</span>
<span class="btn" @click.stop="shareEvent(i)">{{$t('share')}}</span>
<span class="btn" @click.stop="downloadEvent(i)">{{$t('download')}}</span>
</span>
</li>
</ul>
@@ -80,6 +81,7 @@ import { sites, getSite } from '../lib/site/sites'
import tools from '../lib/site/tools'
import video from '../lib/dexie/video'
import setting from '../lib/dexie/setting'
const { clipboard } = require('electron')
export default {
name: 'film',
data () {
@@ -261,6 +263,33 @@ export default {
v: e
}
},
downloadEvent (e) {
tools.detail_get(e.site, e.detail).then(res => {
if (res.mp4_urls.length > 0) {
const urls = [...res.mp4_urls]
let txt = `${e.name}\n`
for (const i of urls) {
const name = i.split('$')[0]
const url = encodeURI(i.split('$')[1])
txt += (name + ': ' + url + '\n')
}
clipboard.writeText(txt)
this.$m.success('〖MP4〗: ' + this.$t('copy_success'))
return false
}
if (res.m3u8_urls.length > 0) {
const urls = [...res.m3u8_urls]
let txt = `${e.name}\n`
for (const i of urls) {
const name = i.split('$')[0]
const url = encodeURI(i.split('$')[1])
txt += (name + ': ' + url + '\n')
}
clipboard.writeText(txt)
this.$m.success('〖M3U8〗: ' + this.$t('copy_success'))
}
})
},
tbPageChange (e) {
this.tb.loading = true
this.tb.page = e
@@ -277,7 +306,7 @@ export default {
</script>
<style lang="scss" scoped>
.film{
height: 670px;
height: calc(100% - 40px);
width: 100%;
display: flex;
flex-direction: column;
@@ -323,7 +352,7 @@ export default {
}
}
.middle{
height: 620px;
height: calc(100% - 40px);
width: 100%;
margin-top: 10px;
padding-bottom: 0px;

View File

@@ -308,6 +308,16 @@ export default {
this.$m.warning(this.$t('last_video'))
}
},
prevEvent () {
const v = { ...this.video }
const i = v.index - 1
if (i > 0) {
this.video.currentTime = 0
this.video.index--
} else {
this.$m.warning(this.$t('first_video'))
}
},
listEvent () {
if (this.right.type === 'list') {
this.right.show = false
@@ -404,13 +414,27 @@ export default {
history.all().then(res => {
this.right.historyData = res
})
ipc.on('next', () => {
if (this.xg) {
if (this.xg.hasStart) {
this.nextEvent()
}
}
})
ipc.on('prev', () => {
if (this.xg) {
if (this.xg.hasStart) {
this.prevEvent()
}
}
})
}
}
</script>
<style lang="scss" scoped>
.play{
position: relative;
height: 660px;
height: calc(100% - 40px);
width: 100%;
display: flex;
justify-content: center;

View File

@@ -174,7 +174,7 @@ export default {
</script>
<style lang="scss" scoped>
.setting{
height: 660px;
height: calc(100% - 40px);
width: 100%;
padding: 20px 0;
.setting-box{

View File

@@ -6,7 +6,7 @@
<span class="type">{{$t('type')}}</span>
<span class="time">{{$t('time')}}</span>
<span class="from">{{$t('from')}}</span>
<span class="operate" style="width: 170px">{{$t('operate')}}</span>
<span class="operate" style="width: 220px">{{$t('operate')}}</span>
</div>
<div class="tBody zy-scroll">
<ul v-show="!loading">
@@ -15,11 +15,12 @@
<span class="type">{{i.type}}</span>
<span class="time">{{i.time}}</span>
<span class="from">{{i.site | ftSite}}</span>
<span class="operate" style="width: 170px">
<span class="operate" style="width: 220px">
<span class="btn" @click.stop="playEvent(i)">{{$t('play')}}</span>
<span class="btn" @click.stop="deleteEvent(i)">{{$t('delete')}}</span>
<span class="btn" @click.stop="shareEvent(i)">{{$t('share')}}</span>
<span class="btn" @click.stop="updateEvent(i)">{{$t('sync')}}</span>
<span class="btn" @click.stop="downloadEvent(i)">{{$t('download')}}</span>
</span>
</li>
</ul>
@@ -38,6 +39,7 @@ import { mapMutations } from 'vuex'
import tools from '../lib/site/tools'
import video from '../lib/dexie/video'
import { sites, getSite } from '../lib/site/sites'
const { clipboard } = require('electron')
export default {
name: 'star',
data () {
@@ -136,6 +138,33 @@ export default {
}
})
},
downloadEvent (e) {
tools.detail_get(e.site, e.detail).then(res => {
if (res.mp4_urls.length > 0) {
const urls = [...res.mp4_urls]
let txt = `${e.name}\n`
for (const i of urls) {
const name = i.split('$')[0]
const url = encodeURI(i.split('$')[1])
txt += (name + ': ' + url + '\n')
}
clipboard.writeText(txt)
this.$m.success('〖MP4〗: ' + this.$t('copy_success'))
return false
}
if (res.m3u8_urls.length > 0) {
const urls = [...res.m3u8_urls]
let txt = `${e.name}\n`
for (const i of urls) {
const name = i.split('$')[0]
const url = encodeURI(i.split('$')[1])
txt += (name + ': ' + url + '\n')
}
clipboard.writeText(txt)
this.$m.success('〖M3U8〗: ' + this.$t('copy_success'))
}
})
},
getAllStar () {
video.all().then(res => {
this.data = res.reverse()
@@ -150,7 +179,7 @@ export default {
</script>
<style lang="scss" scoped>
.star{
height: 660px;
height: calc(100% - 40px);
width: 100%;
display: flex;
flex-direction: column;

View File

@@ -36,6 +36,7 @@
"delete_success": "Delete successful.",
"delete_failed": "Delete failed.",
"star_success": "Collection success.",
"first_video": "This is the first episode.",
"last_video": "This is the last episode.",
"qr_tips": "Long click recognition.",
"zy_tips": "Prohibit the dissemination of illegal resources.",

View File

@@ -29,13 +29,14 @@
"sync": "同步",
"total": "条数据",
"website": "官网",
"issues": "内测反馈",
"issues": "反馈",
"theme": "主题",
"donate": "捐赠",
"set_success": "设置成功。",
"delete_success": "删除成功。",
"delete_failed": "删除失败。",
"star_success": "收藏成功。",
"first_video": "这已经是第一集了。",
"last_video": "这已经是最后一集了。",
"qr_tips": "长按二维码,识别播放。",
"zy_tips": "『ZY Player』技术支持严禁传播违法资源。",

View File

@@ -130,6 +130,9 @@ export default {
}, 10000)
},
prevEvent () {
if (this.index === 0) {
return false
}
history.find({ detail: this.video.detail }).then(res => {
const v = res
v.index--
@@ -144,6 +147,9 @@ export default {
})
},
nextEvent () {
if (this.index >= this.d.m3u8_urls.length - 1) {
return false
}
history.find({ detail: this.video.detail }).then(res => {
const v = res
v.index++
@@ -163,6 +169,32 @@ export default {
},
mounted () {
this.xg = new Hls(this.config)
ipc.on('next', () => {
if (this.xg) {
if (this.xg.hasStart) {
this.nextEvent()
}
}
})
ipc.on('prev', () => {
if (this.xg) {
if (this.xg.hasStart) {
this.prevEvent()
}
}
})
ipc.on('up', () => {
if (this.opacity <= 95) {
this.opacity = this.opacity + 5
this.opacityChange(this.opacity)
}
})
ipc.on('down', () => {
if (this.opacity >= 10) {
this.opacity = this.opacity - 5
this.opacityChange(this.opacity)
}
})
}
}
</script>

View File

@@ -13,7 +13,7 @@ module.exports = {
},
appId: 'com.hunlongyu.zy',
copyright: 'Copyright @ 2020 Hunlongyu',
productName: 'ZY Player 内测版',
productName: 'ZY Player',
publish: [
{
provider: 'github',

3584
yarn.lock

File diff suppressed because it is too large Load Diff