Compare commits
29 Commits
v0.21.0
...
issue-1711
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a445c18979 | ||
|
|
5280fc76e9 | ||
|
|
d4a8d9a120 | ||
|
|
3fbf33b8ae | ||
|
|
2c5fcab469 | ||
|
|
8fc7150559 | ||
|
|
89b53ffe96 | ||
|
|
e990bc898d | ||
|
|
cb699b5fec | ||
|
|
8a235c31e0 | ||
|
|
8ee27b8ef4 | ||
|
|
5023651e63 | ||
|
|
b9bcf747de | ||
|
|
88e7167b6c | ||
|
|
f5ab39be8e | ||
|
|
6e69e5d36e | ||
|
|
9c4ca25615 | ||
|
|
d15f40b22d | ||
|
|
1befac8d0e | ||
|
|
cfa1ebbea7 | ||
|
|
2a679dd6e8 | ||
|
|
fce5f00925 | ||
|
|
39d04c4b2a | ||
|
|
5688e4538c | ||
|
|
4e18d4091a | ||
|
|
cfde3ee85d | ||
|
|
1c343cb4c1 | ||
|
|
e3e490daa5 | ||
|
|
b8f7880a78 |
1
.github/FUNDING.yml
vendored
1
.github/FUNDING.yml
vendored
@@ -1,2 +1 @@
|
||||
github: feross
|
||||
custom: https://paypal.me/borewit
|
||||
|
||||
@@ -125,6 +125,7 @@ The following optional arguments are available:
|
||||
- `--sign` - Sign the application (Mac, Windows)
|
||||
- `--package=[type]` - Package single output type.
|
||||
- `deb` - Debian package
|
||||
- `rpm` - RedHat package
|
||||
- `zip` - Linux zip file
|
||||
- `dmg` - Mac disk image
|
||||
- `exe` - Windows installer
|
||||
@@ -141,11 +142,12 @@ The Windows app can be packaged from **any** platform.
|
||||
Note: Windows code signing only works from **Windows**, for now.
|
||||
|
||||
Note: To package the Windows app from non-Windows platforms,
|
||||
[Wine](https://www.winehq.org/) needs to be installed. For example on Mac, first
|
||||
install [XQuartz](http://www.xquartz.org/), then run:
|
||||
[Wine](https://www.winehq.org/) and [Mono](https://www.mono-project.com/) need
|
||||
to be installed. For example on Mac, first install
|
||||
[XQuartz](http://www.xquartz.org/), then run:
|
||||
|
||||
```
|
||||
brew install wine
|
||||
brew install wine mono
|
||||
```
|
||||
|
||||
(Requires the [Homebrew](http://brew.sh/) package manager.)
|
||||
@@ -163,7 +165,6 @@ If packaging from Mac, install system dependencies with Homebrew by running:
|
||||
```
|
||||
npm run install-system-deps
|
||||
```
|
||||
|
||||
#### Recommended readings to start working in the app
|
||||
|
||||
Electron (Framework to make native apps for Windows, OSX and Linux in Javascript):
|
||||
|
||||
@@ -173,8 +173,8 @@ const linux = {
|
||||
// Build for Linux.
|
||||
platform: 'linux',
|
||||
|
||||
// Build x64 binary onle.
|
||||
arch: 'x64'
|
||||
// Build x64 and arm64 binaries.
|
||||
arch: ['x64', 'arm64']
|
||||
|
||||
// Note: Application icon for Linux is specified via the BrowserWindow `icon` option.
|
||||
}
|
||||
@@ -485,11 +485,16 @@ function buildLinux (cb) {
|
||||
|
||||
const tasks = []
|
||||
buildPath.forEach(function (filesPath) {
|
||||
const destArch = filesPath.split('-').pop()
|
||||
|
||||
if (argv.package === 'deb' || argv.package === 'all') {
|
||||
tasks.push((cb) => packageDeb(filesPath, cb))
|
||||
tasks.push((cb) => packageDeb(filesPath, destArch, cb))
|
||||
}
|
||||
if (argv.package === 'rpm' || argv.package === 'all') {
|
||||
tasks.push((cb) => packageRpm(filesPath, destArch, cb))
|
||||
}
|
||||
if (argv.package === 'zip' || argv.package === 'all') {
|
||||
tasks.push((cb) => packageZip(filesPath, cb))
|
||||
tasks.push((cb) => packageZip(filesPath, destArch, cb))
|
||||
}
|
||||
})
|
||||
series(tasks, cb)
|
||||
@@ -497,16 +502,21 @@ function buildLinux (cb) {
|
||||
cb(err)
|
||||
})
|
||||
|
||||
function packageDeb (filesPath, cb) {
|
||||
function packageDeb (filesPath, destArch, cb) {
|
||||
// Linux convention for Debian based 'x64' is 'amd64'
|
||||
if (destArch === 'x64') {
|
||||
destArch = 'amd64'
|
||||
}
|
||||
|
||||
// Create .deb file for Debian-based platforms
|
||||
console.log('Linux: Creating deb...')
|
||||
console.log(`Linux: Creating ${destArch} deb...`)
|
||||
|
||||
const installer = require('electron-installer-debian')
|
||||
|
||||
const options = {
|
||||
src: filesPath + '/',
|
||||
dest: DIST_PATH,
|
||||
arch: 'amd64',
|
||||
arch: destArch,
|
||||
bin: 'WebTorrent',
|
||||
icon: {
|
||||
'48x48': path.join(config.STATIC_PATH, 'linux/share/icons/hicolor/48x48/apps/webtorrent-desktop.png'),
|
||||
@@ -519,22 +529,56 @@ function buildLinux (cb) {
|
||||
|
||||
installer(options).then(
|
||||
() => {
|
||||
console.log('Linux: Created deb.')
|
||||
console.log(`Linux: Created ${destArch} deb.`)
|
||||
cb(null)
|
||||
},
|
||||
(err) => cb(err)
|
||||
)
|
||||
}
|
||||
|
||||
function packageZip (filesPath, cb) {
|
||||
function packageRpm (filesPath, destArch, cb) {
|
||||
// Linux convention for RedHat based 'x64' is 'x86_64'
|
||||
if (destArch === 'x64') {
|
||||
destArch = 'x86_64'
|
||||
}
|
||||
|
||||
// Create .rpm file for RedHat-based platforms
|
||||
console.log(`Linux: Creating ${destArch} rpm...`)
|
||||
|
||||
const installer = require('electron-installer-redhat')
|
||||
|
||||
const options = {
|
||||
src: filesPath + '/',
|
||||
dest: DIST_PATH,
|
||||
arch: destArch,
|
||||
bin: 'WebTorrent',
|
||||
icon: {
|
||||
'48x48': path.join(config.STATIC_PATH, 'linux/share/icons/hicolor/48x48/apps/webtorrent-desktop.png'),
|
||||
'256x256': path.join(config.STATIC_PATH, 'linux/share/icons/hicolor/256x256/apps/webtorrent-desktop.png')
|
||||
},
|
||||
categories: ['Network', 'FileTransfer', 'P2P'],
|
||||
mimeType: ['application/x-bittorrent', 'x-scheme-handler/magnet', 'x-scheme-handler/stream-magnet'],
|
||||
desktopTemplate: path.join(config.STATIC_PATH, 'linux/webtorrent-desktop.ejs')
|
||||
}
|
||||
|
||||
installer(options).then(
|
||||
() => {
|
||||
console.log(`Linux: Created ${destArch} rpm.`)
|
||||
cb(null)
|
||||
},
|
||||
(err) => cb(err)
|
||||
)
|
||||
}
|
||||
|
||||
function packageZip (filesPath, destArch, cb) {
|
||||
// Create .zip file for Linux
|
||||
console.log('Linux: Creating zip...')
|
||||
console.log(`Linux: Creating ${destArch} zip...`)
|
||||
|
||||
const inPath = path.join(DIST_PATH, path.basename(filesPath))
|
||||
const outPath = path.join(DIST_PATH, BUILD_NAME + '-linux.zip')
|
||||
const outPath = path.join(DIST_PATH, `${BUILD_NAME}-linux-${destArch}.zip`)
|
||||
zip.zipSync(inPath, outPath)
|
||||
|
||||
console.log('Linux: Created zip.')
|
||||
console.log(`Linux: Created ${destArch} zip.`)
|
||||
cb(null)
|
||||
}
|
||||
}
|
||||
|
||||
45
package-lock.json
generated
45
package-lock.json
generated
@@ -1955,7 +1955,6 @@
|
||||
"version": "0.10.1",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn-promise/-/cross-spawn-promise-0.10.1.tgz",
|
||||
"integrity": "sha1-25y0xQxgtyoVvgSbeBIs44LYexA=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"cross-spawn": "^5.1.0"
|
||||
},
|
||||
@@ -1964,7 +1963,6 @@
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
|
||||
"integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"lru-cache": "^4.0.1",
|
||||
"shebang-command": "^1.2.0",
|
||||
@@ -2499,7 +2497,6 @@
|
||||
"version": "0.7.3",
|
||||
"resolved": "https://registry.npmjs.org/electron-installer-common/-/electron-installer-common-0.7.3.tgz",
|
||||
"integrity": "sha512-l4chYFTWr6uWODKYUXeC+Z4tqGa3b8e+Y2WUBf3F7Ruv6yYzZ+Ccic65oXreeotx09B7sUx1KTuwXRsRJHKlMw==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"asar": "^2.0.1",
|
||||
"cross-spawn-promise": "^0.10.1",
|
||||
@@ -2516,7 +2513,6 @@
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
|
||||
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
@@ -2525,7 +2521,6 @@
|
||||
"version": "8.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
|
||||
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"graceful-fs": "^4.2.0",
|
||||
"jsonfile": "^4.0.0",
|
||||
@@ -2571,6 +2566,42 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"electron-installer-redhat": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-2.0.0.tgz",
|
||||
"integrity": "sha512-kf7+/t8XIp1I6LIV9v6K38rBHzmY6bUr3TunJZKdlIKQ7j6wyjjpgbpxSBcg3S7pgzq1kkgCYZvpr8CsLFVivw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"debug": "^4.1.1",
|
||||
"electron-installer-common": "^0.7.1",
|
||||
"fs-extra": "^8.0.1",
|
||||
"lodash": "^4.17.4",
|
||||
"word-wrap": "^1.2.3",
|
||||
"yargs": "^13.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
|
||||
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"fs-extra": {
|
||||
"version": "8.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
|
||||
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"graceful-fs": "^4.2.0",
|
||||
"jsonfile": "^4.0.0",
|
||||
"universalify": "^0.1.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"electron-notarize": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.1.1.tgz",
|
||||
@@ -9031,7 +9062,6 @@
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-2.0.2.tgz",
|
||||
"integrity": "sha512-zl71nFWjPKW2KXs+73gEk8RmqvtAeXPxhWDkTUoa3MSMkjq3I+9OeknjF178MQoMYsdqL730hfzvNfEkePxq9Q==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"tmp": "0.1.0"
|
||||
}
|
||||
@@ -10015,8 +10045,7 @@
|
||||
"word-wrap": {
|
||||
"version": "1.2.3",
|
||||
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
|
||||
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
|
||||
"optional": true
|
||||
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
|
||||
},
|
||||
"wordwrap": {
|
||||
"version": "0.0.2",
|
||||
|
||||
@@ -87,7 +87,8 @@
|
||||
"main": "index.js",
|
||||
"optionalDependencies": {
|
||||
"appdmg": "^0.6.0",
|
||||
"electron-installer-debian": "^2.0.0"
|
||||
"electron-installer-debian": "^2.0.0",
|
||||
"electron-installer-redhat": "^2.0.0"
|
||||
},
|
||||
"private": true,
|
||||
"productName": "WebTorrent",
|
||||
@@ -96,10 +97,10 @@
|
||||
"url": "git://github.com/webtorrent/webtorrent-desktop.git"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "buble src --output build",
|
||||
"build": "buble src --target chrome:71 --output build",
|
||||
"clean": "node ./bin/clean.js",
|
||||
"gh-release": "gh-release",
|
||||
"install-system-deps": "brew install fakeroot dpkg",
|
||||
"install-system-deps": "brew install fakeroot dpkg rpm",
|
||||
"open-config": "node ./bin/open-config.js",
|
||||
"package": "node ./bin/package.js",
|
||||
"start": "npm run build && electron .",
|
||||
|
||||
@@ -32,7 +32,7 @@ class PathSelector extends React.Component {
|
||||
|
||||
handleClick () {
|
||||
const opts = Object.assign({
|
||||
defaultPath: this.props.value && path.dirname(this.props.value),
|
||||
defaultPath: path.dirname(this.props.value || ''),
|
||||
properties: ['openFile', 'openDirectory']
|
||||
}, this.props.dialog)
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ function run (state) {
|
||||
if (semver.lt(version, '0.17.0')) migrate_0_17_0(saved)
|
||||
if (semver.lt(version, '0.17.2')) migrate_0_17_2(saved)
|
||||
if (semver.lt(version, '0.21.0')) migrate_0_21_0(saved)
|
||||
if (semver.lt(version, '0.21.1')) migrate_0_21_1(saved)
|
||||
|
||||
// Config is now on the new version
|
||||
state.saved.version = config.APP_VERSION
|
||||
@@ -214,3 +215,9 @@ function migrate_0_21_0 (saved) {
|
||||
saved.prefs.soundNotifications = true
|
||||
}
|
||||
}
|
||||
|
||||
function migrate_0_21_1 (saved) {
|
||||
if (saved.prefs.externalPlayerPath == null) {
|
||||
saved.prefs.externalPlayerPath = ''
|
||||
}
|
||||
}
|
||||
|
||||
@@ -119,7 +119,7 @@ function setupStateSaved () {
|
||||
downloadPath: config.DEFAULT_DOWNLOAD_PATH,
|
||||
isFileHandler: false,
|
||||
openExternalPlayer: false,
|
||||
externalPlayerPath: null,
|
||||
externalPlayerPath: '',
|
||||
startup: false,
|
||||
soundNotifications: true,
|
||||
autoAddTorrents: false,
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
/* global HTMLMediaElement */
|
||||
|
||||
const React = require('react')
|
||||
const Bitfield = require('bitfield')
|
||||
const prettyBytes = require('prettier-bytes')
|
||||
@@ -56,6 +54,10 @@ function renderMedia (state) {
|
||||
mediaElement.pause()
|
||||
} else if (!state.playing.isPaused && mediaElement.paused) {
|
||||
mediaElement.play()
|
||||
.then(
|
||||
() => dispatch('mediaSuccess'),
|
||||
err => dispatch('mediaError', err.name === 'NotSupportedError' ? 'Codec unsupported' : `${err.name}: ${err.message}`)
|
||||
)
|
||||
}
|
||||
// When the user clicks or drags on the progress bar, jump to that position
|
||||
if (state.playing.jumpToTime != null) {
|
||||
@@ -127,10 +129,8 @@ function renderMedia (state) {
|
||||
onLoadedMetadata={onLoadedMetadata}
|
||||
onEnded={onEnded}
|
||||
onStalled={dispatcher('mediaStalled')}
|
||||
onError={dispatcher('mediaError')}
|
||||
onTimeUpdate={dispatcher('mediaTimeUpdate')}
|
||||
onEncrypted={dispatcher('mediaEncrypted')}
|
||||
onCanPlay={onCanPlay}
|
||||
>
|
||||
{trackTags}
|
||||
</MediaTagName>
|
||||
@@ -168,20 +168,6 @@ function renderMedia (state) {
|
||||
if (state.window.isFullScreen) dispatch('toggleFullScreen')
|
||||
}
|
||||
}
|
||||
|
||||
function onCanPlay (e) {
|
||||
const elem = e.target
|
||||
if (elem.readyState < HTMLMediaElement.HAVE_FUTURE_DATA) return
|
||||
if (state.playing.type === 'video' &&
|
||||
elem.webkitVideoDecodedByteCount === 0) {
|
||||
dispatch('mediaError', 'Video codec unsupported')
|
||||
} else if (elem.webkitAudioDecodedByteCount === 0) {
|
||||
dispatch('mediaError', 'Audio codec unsupported')
|
||||
} else {
|
||||
dispatch('mediaSuccess')
|
||||
elem.play()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function renderOverlay (state) {
|
||||
|
||||
@@ -212,7 +212,9 @@ module.exports = class TorrentList extends React.Component {
|
||||
else if (torrentSummary.progress.progress === 1) status = 'Not seeding'
|
||||
else status = 'Paused'
|
||||
} else if (torrentSummary.status === 'downloading') {
|
||||
status = 'Downloading'
|
||||
if (!torrentSummary.progress) status = ''
|
||||
else if (!torrentSummary.progress.ready) status = 'Verifying'
|
||||
else status = 'Downloading'
|
||||
} else if (torrentSummary.status === 'seeding') {
|
||||
status = 'Seeding'
|
||||
} else { // torrentSummary.status is 'new' or something unexpected
|
||||
@@ -316,7 +318,7 @@ module.exports = class TorrentList extends React.Component {
|
||||
torrentSummary.progress.files[index]) {
|
||||
const fileProg = torrentSummary.progress.files[index]
|
||||
isDone = fileProg.numPiecesPresent === fileProg.numPieces
|
||||
progress = Math.round(100 * fileProg.numPiecesPresent / fileProg.numPieces) + '%'
|
||||
progress = Math.floor(100 * fileProg.numPiecesPresent / fileProg.numPieces) + '%'
|
||||
}
|
||||
|
||||
// Second, for media files where we saved our position, show how far we got
|
||||
|
||||
Reference in New Issue
Block a user