Compare commits

...

42 Commits

Author SHA1 Message Date
Feross Aboukhadijeh
f5d0692a56 0.18.0 2017-02-03 02:04:28 -08:00
Feross Aboukhadijeh
2f4fe3e521 disable background throttling in all windows 2017-02-03 02:04:17 -08:00
Feross Aboukhadijeh
4937f61199 move Transfers menu 2017-02-03 02:03:47 -08:00
Feross Aboukhadijeh
e74b993ecd updated copyright year 2017-02-03 02:03:12 -08:00
Feross Aboukhadijeh
36be5b2556 changelog for 0.18.0 2017-02-03 02:02:59 -08:00
Feross Aboukhadijeh
6a3aaba01f test: update test for new default trackers 2017-02-03 00:52:09 -08:00
Feross Aboukhadijeh
c50783d058 test: update screenshot for new default trackers 2017-02-03 00:51:58 -08:00
Feross Aboukhadijeh
32b251fa58 remove unneeded package from depcheck 2017-02-03 00:50:08 -08:00
Feross Aboukhadijeh
fcf087810e package: fix deprecation warning 2017-02-03 00:24:58 -08:00
Feross Aboukhadijeh
0124412d3d lock down dev dependencies
Let's be very explicit about updating these. They are very critical to
the build process, so we should always read the changelogs / commit log
before upgrading.
2017-02-03 00:24:41 -08:00
Feross Aboukhadijeh
dd570d9250 electron-osx-sign@0.4 2017-02-03 00:12:16 -08:00
Feross Aboukhadijeh
64add5d68b electron@1.4.15 2017-02-03 00:07:30 -08:00
Feross Aboukhadijeh
36a43b645e buble@0.15 2017-02-02 21:01:28 -08:00
Nuno Campos
e01c0b6f43 Add textarea to list of html tags that skip document-wide onPaste 2017-02-02 15:17:10 -08:00
Feross Aboukhadijeh
efc984f1dd Include policy about copyrighted content in issues in issue template 2017-01-20 19:07:42 -08:00
Feross Aboukhadijeh
a046db40d2 Update react-tap-event-plugin 2.0.1
Fixes https://github.com/feross/webtorrent-desktop/issues/1086
2016-12-07 21:01:12 -08:00
Feross Aboukhadijeh
9068909b4d fixes for standard 2016-11-22 19:43:51 -03:00
Mathias Rasmussen
4bb2056bc9 Auto-focus modal 'OK' button to allow keypress 2016-10-24 14:43:19 -05:00
Karan Thakkar
ed0f05abc4 Pause All will now pause seeding torrents too 2016-10-24 13:33:38 -05:00
Karan Thakkar
0c44e10ca7 Move sound.play outisde the for loop 2016-10-24 13:33:38 -05:00
Karan Thakkar
d8c9014471 Add a new Transfers menu to allow pause all and resume all torrents 2016-10-24 13:33:38 -05:00
Feross Aboukhadijeh
7cf1d96a80 Fixes for PR #1050 2016-10-18 12:49:09 +01:00
Adam Gotlib
ffd9fbda57 Disallow saving torrent file until it is generated
Fixes #1031.
2016-10-18 12:46:33 +01:00
Adam Gotlib
d8904aaf6e Log successful attempts to open an external player 2016-10-13 23:31:34 -05:00
Adam Gotlib
de2db211cc Log play attempt separately for each file 2016-10-13 23:31:34 -05:00
Adam Gotlib
e8ab172d1b Remove unused 'timeout' field from telemetry 2016-10-13 23:31:34 -05:00
Alexey Romanov
32f96c03dd #1039: Formatting fixed.
Removed comma and added space after download speed.
2016-10-13 21:24:17 -07:00
Feross Aboukhadijeh
5158606740 Remove lodash.merge require() hack
See:
https://github.com/callemall/material-ui/pull/4380#issuecomment-25089455
2

My PR to material-ui to replace the full `lodash` with just the needed
functions was merged. So we can remove this hack.
2016-10-12 17:53:52 -05:00
Feross Aboukhadijeh
0de80165ed material-ui@0.16 2016-10-12 17:53:52 -05:00
Feross Aboukhadijeh
dcaa99d2bf es6-error@4 2016-10-12 17:53:52 -05:00
Feross Aboukhadijeh
1a1a4cd5d0 electron 1.4.3
Changelog: https://github.com/electron/electron/releases/tag/v1.4.3
2016-10-12 17:53:52 -05:00
Feross Aboukhadijeh
4cbad1fccd 0.17.2 2016-10-10 22:44:08 -07:00
Feross Aboukhadijeh
f818564dd1 package.json: Add {"private": true}
To prevent accidental publishing to npm.
2016-10-10 22:41:17 -07:00
Feross Aboukhadijeh
8be690a26e v0.17.2 changelog 2016-10-10 22:37:24 -07:00
Feross Aboukhadijeh
8081d42477 Attempt to fix "TypeError: Cannot read property 'startPiece' of undefined"
It wasn't clear what was causing this error, and I couldn't reproduce
it.

This PR attempts to resolve the issue by just guarding against the
exception.
2016-10-10 22:31:33 -07:00
Feross Aboukhadijeh
b0b6069fe2 remove 'pug' from nodemon command (we don't use pug) 2016-10-06 00:37:11 -07:00
Feross Aboukhadijeh
994aed9af7 Fix "Cannot read property 'files' of null"
This PR fixes one of our number 2 top error (142 error reports today
alone):

Processes: webtorrent window, platforms: darwin linux win32, versions:
pre-0.12 0.14.0 0.17.0 0.17.1
TypeError: Cannot read property 'files' of null
    at getAudioMetadata (.../build/renderer/webtorrent.js:328:21)
    at EventEmitter.<anonymous> (.../build/renderer/webtorrent.js:84:74)
    at emitThree (events.js:116:13)
    at EventEmitter.emit (events.js:194:7)

This error is reproducible if you start webtorrent for the first time
and click the WIRED CD torrent. This causes the webtorrent process to
get a  'wt-get-audio-metadata' before 'wt-start-torrenting'.

You can reproduce it 100% of the time if you force the race condition
to show itself by slowing down the sending of the 'wt-start-torrenting'
event.

(This same error was showing for an unrelated reason in the past: #891)
2016-10-05 03:00:52 -07:00
Feross Aboukhadijeh
852fc86cbd Remove unecessary return statement 2016-10-05 03:00:52 -07:00
Feross Aboukhadijeh
8801a87a58 Throttle browser-window 'move' and 'resize' events
Fixes: https://github.com/feross/webtorrent-desktop/issues/1011
2016-10-05 03:00:42 -07:00
Feross Aboukhadijeh
1e10f0083c Windows: Fix impossible to delete Wired CS torrent 2016-10-05 03:00:24 -07:00
Feross Aboukhadijeh
bb40f0f11a Update Mac integration test for Sierra 10.12
The font changed slightly on the next version of Mac OS. Let's update
the screenshots to match, since I already updated. (@dcposch - you'll
need to update too if you want the integration tests to pass on your
machine)
2016-10-04 01:53:49 -07:00
Feross Aboukhadijeh
78d7243a08 package: Explicitly specify architectures to build for
Electron now offers a "armv7l" build on Linux. Because we were
specifying "all", we were generating an armv7l binary which was being
included in "WebTorrent-vX.X.X-linux.zip" along with the ia32 build,
which explains why it was 90MB+ in the last release.
2016-10-03 04:40:42 -07:00
49 changed files with 213 additions and 135 deletions

View File

@@ -1,3 +1,5 @@
<!-- DO NOT POST LINKS OR REFERENCES TO COPYRIGHTED CONTENT IN YOUR ISSUE. -->
**What version of WebTorrent Desktop?** (See the 'About WebTorrent' menu) **What version of WebTorrent Desktop?** (See the 'About WebTorrent' menu)
**What operating system and version?** **What operating system and version?**

View File

@@ -1,5 +1,33 @@
# WebTorrent Desktop Version History # WebTorrent Desktop Version History
## v0.18.0
### Added
- Add a new "Transfers" menu for pausing or resuming all torrents (#1027)
### Changed
- Update Electron to 1.4.15
- Windows 32-bit: App can use 4GB of memory instead of just 2GB
- Fix "Portable App" writing crash reports to "%APPDATA%\Temp" (Windows)
- Updated WebTorrent engine to 0.98.5
- Fix issue where http web seeds would sometimes stall
- Don't send 'completed' event to tracker again if torrent is already complete
- Add more peer ID entropy
- Set user-agent header for tracker http requests
### Fixed
- Fix paste shortcut in tracker list on Create Torrent page (#1112)
- Auto-focus the 'OK' button in modal dialogs (#1058)
- Fix formatting issue in the speed stats on the Player page (#1039)
## v0.17.2 - 2016-10-10
### Fixed
- Windows: Fix impossible-to-delete "Wired CD" default torrent
- Throttle browser-window 'move' and 'resize' events
- Fix crash ("Cannot read property 'files' of null" error)
- Fix crash ("TypeError: Cannot read property 'startPiece' of undefined")
## v0.17.1 - 2016-10-03 ## v0.17.1 - 2016-10-03
### Changed ### Changed
@@ -99,16 +127,13 @@
## v0.12.0 - 2016-08-23 ## v0.12.0 - 2016-08-23
### Added ### Added
- Custom external media player - Custom external media player
- Linux: add system-wide launcher and icons for Debian, including Ubuntu - Linux: add system-wide launcher and icons for Debian, including Ubuntu
### Changed ### Changed
- Telemetry improvements: redact stacktraces, log app version - Telemetry improvements: redact stacktraces, log app version
### Fixed ### Fixed
- Fix playback and download of default torrents ("missing path" error) (#804) - Fix playback and download of default torrents ("missing path" error) (#804)
- Fix Delete Torrent + Data for newly added magnet links - Fix Delete Torrent + Data for newly added magnet links
- Fix jumpToTime error (#804) - Fix jumpToTime error (#804)
@@ -121,13 +146,11 @@
- Check for missing default download path and torrent folders on start up (#776) - Check for missing default download path and torrent folders on start up (#776)
### Changed ### Changed
- Do not automatically set WebTorrent as the default handler for torrents (#771) - Do not automatically set WebTorrent as the default handler for torrents (#771)
- Torrents can only be created from the home screen (#770) - Torrents can only be created from the home screen (#770)
- Update Electron to 1.3.3 (#772) - Update Electron to 1.3.3 (#772)
### Fixed ### Fixed
- Allow modifying the default tracker list on the Create Torrent page (#775) - Allow modifying the default tracker list on the Create Torrent page (#775)
- Prevent opening multiple stacked Preference windows or Create Torrent windows (#770) - Prevent opening multiple stacked Preference windows or Create Torrent windows (#770)
- Windows: Player window auto-resize does not match video aspect ratio (#565) - Windows: Player window auto-resize does not match video aspect ratio (#565)
@@ -136,13 +159,11 @@
## v0.10.0 - 2016-08-05 ## v0.10.0 - 2016-08-05
### Added ### Added
- Drag-and-drop magnet links (selected text) is now supported (#284) - Drag-and-drop magnet links (selected text) is now supported (#284)
- Windows: Add "User Tasks" shortcuts to app icon in Start Menu (#114) - Windows: Add "User Tasks" shortcuts to app icon in Start Menu (#114)
- Linux: Show badge count for completed torrent downloads - Linux: Show badge count for completed torrent downloads
### Changed ### Changed
- Change WebTorrent Desktop peer ID prefix to 'WD' to distinguish from WebTorrent in the browser, 'WW' (#688) - Change WebTorrent Desktop peer ID prefix to 'WD' to distinguish from WebTorrent in the browser, 'WW' (#688)
- Switch UI to React to improve UI rendering speed (#729) - Switch UI to React to improve UI rendering speed (#729)
- The primary bottleneck was actually `hyperx`, not `virtual-dom`. - The primary bottleneck was actually `hyperx`, not `virtual-dom`.
@@ -159,7 +180,6 @@
- Location history abstraction released independently as [`location-history`](https://www.npmjs.com/package/location-history) - Location history abstraction released independently as [`location-history`](https://www.npmjs.com/package/location-history)
### Fixed ### Fixed
- When streaming to VLC, set VLC window title to torrent file name (#746) - When streaming to VLC, set VLC window title to torrent file name (#746)
- Fix "Cannot read property 'numPiecesPresent' of undefined" exception (#695) - Fix "Cannot read property 'numPiecesPresent' of undefined" exception (#695)
- Fix rare case where config file could not be completely written (#733) - Fix rare case where config file could not be completely written (#733)
@@ -167,35 +187,29 @@
## v0.9.0 - 2016-07-20 ## v0.9.0 - 2016-07-20
### Added ### Added
- Save selected subtitles - Save selected subtitles
- Ask for confirmation before deleting torrents - Ask for confirmation before deleting torrents
- Support Debian Jessie - Support Debian Jessie
### Changed ### Changed
- Only send telemetry in production - Only send telemetry in production
- Clean up the code. Split main.js, refactor lots of things - Clean up the code. Split main.js, refactor lots of things
### Fixed ### Fixed
- Fix state.playing.jumpToTime behavior - Fix state.playing.jumpToTime behavior
- Remove torrent file and poster image when deleting a torrent - Remove torrent file and poster image when deleting a torrent
## v0.8.1 - 2016-06-24 ## v0.8.1 - 2016-06-24
### Added ### Added
- New URI handler: stream-magnet - New URI handler: stream-magnet
### Fixed ### Fixed
- DLNA crashing bug - DLNA crashing bug
## v0.8.0 - 2016-06-23 ## v0.8.0 - 2016-06-23
### Added ### Added
- Cast menu: choose which Chromecast, Airplay, or DLNA device you want to use - Cast menu: choose which Chromecast, Airplay, or DLNA device you want to use
- Telemetry: send basic data, plus stats on how often the play button works - Telemetry: send basic data, plus stats on how often the play button works
- Make posters from jpeg files, not just jpg - Make posters from jpeg files, not just jpg
@@ -203,17 +217,14 @@
- Windows thumbnail bar with a play/pause button - Windows thumbnail bar with a play/pause button
### Changed ### Changed
- Nicer modal styles - Nicer modal styles
### Fixed ### Fixed
- Windows tray icon now stays in the right state - Windows tray icon now stays in the right state
## v0.7.2 - 2016-06-02 ## v0.7.2 - 2016-06-02
### Fixed ### Fixed
- Fix exception that affects users upgrading from v0.5.1 or older - Fix exception that affects users upgrading from v0.5.1 or older
- Ensure `state.saved.prefs` configuration exists - Ensure `state.saved.prefs` configuration exists
- Fix window title on "About WebTorrent" window - Fix window title on "About WebTorrent" window
@@ -221,23 +232,19 @@
## v0.7.1 - 2016-06-02 ## v0.7.1 - 2016-06-02
### Changed ### Changed
- Change "Step Forward" keyboard shortcut to `Alt+Left` (Windows) - Change "Step Forward" keyboard shortcut to `Alt+Left` (Windows)
- Change "Step Backward" keyboard shortcut to to `Alt+Right` (Windows) - Change "Step Backward" keyboard shortcut to to `Alt+Right` (Windows)
### Fixed ### Fixed
- First time startup bug -- invalid torrent/poster paths - First time startup bug -- invalid torrent/poster paths
## v0.7.0 - 2016-06-02 ## v0.7.0 - 2016-06-02
### Added ### Added
- Improved AirPlay support -- using the new [`airplayer`](https://www.npmjs.com/package/airplayer) package - Improved AirPlay support -- using the new [`airplayer`](https://www.npmjs.com/package/airplayer) package
- Remember volume setting in player, for as long as the app is open - Remember volume setting in player, for as long as the app is open
### Changed ### Changed
- Add (+) button now also accepts non .torrent files and creates a torrent from - Add (+) button now also accepts non .torrent files and creates a torrent from
those files those files
- Show prompt text in title bar for open dialogs (OS X) - Show prompt text in title bar for open dialogs (OS X)
@@ -247,7 +254,6 @@
- Fix crash reporter not working (Windows) - Fix crash reporter not working (Windows)
### Fixed ### Fixed
- Re-enable WebRTC (web peers)! (OS X, Windows) - Re-enable WebRTC (web peers)! (OS X, Windows)
- Windows support was disabled in v0.6.1 to work around a bug in Electron - Windows support was disabled in v0.6.1 to work around a bug in Electron
- OS X support was disabled in v0.4.0 to work around a 100% CPU bug - OS X support was disabled in v0.4.0 to work around a 100% CPU bug
@@ -258,7 +264,6 @@
- Fix torrent loading message UI misalignment - Fix torrent loading message UI misalignment
### Known issues ### Known issues
- When upgrading to WebTorrent Desktop v0.7.0, some torrent metadata (file list, - When upgrading to WebTorrent Desktop v0.7.0, some torrent metadata (file list,
selected files, whether torrent is streamable) will be cleared. Just start the selected files, whether torrent is streamable) will be cleared. Just start the
torrent to re-populate the metadata. torrent to re-populate the metadata.
@@ -266,7 +271,6 @@
## v0.6.1 - 2016-05-26 ## v0.6.1 - 2016-05-26
### Fixed ### Fixed
- Disable WebRTC to work around Electron crash (Windows) - Disable WebRTC to work around Electron crash (Windows)
- Will be re-enabled in the next version of WebTorrent, which will be based on - Will be re-enabled in the next version of WebTorrent, which will be based on
the next version of Electron, where the bug is fixed. the next version of Electron, where the bug is fixed.
@@ -278,7 +282,6 @@
## v0.6.0 - 2016-05-24 ## v0.6.0 - 2016-05-24
### Added ### Added
- Added Preferences page to set Download folder - Added Preferences page to set Download folder
- Save video position, resume playback from saved position - Save video position, resume playback from saved position
- Add additional video player keyboard shortcuts (#275) - Add additional video player keyboard shortcuts (#275)
@@ -288,7 +291,6 @@
- Add announcement feature - Add announcement feature
### Changed ### Changed
- Nicer player UI - Nicer player UI
- Reduce startup jank, improve startup time (#568) - Reduce startup jank, improve startup time (#568)
- Cleanup unsupported codec detection (#569, #570) - Cleanup unsupported codec detection (#569, #570)
@@ -296,7 +298,6 @@
- Improve subtitle positioning (#551) - Improve subtitle positioning (#551)
### Fixed ### Fixed
- Fix Uncaught TypeError: Cannot read property 'update' of undefined (#567) - Fix Uncaught TypeError: Cannot read property 'update' of undefined (#567)
- Fix bugs in LocationHistory - Fix bugs in LocationHistory
- When player is active, and magnet link is pasted, go back to list - When player is active, and magnet link is pasted, go back to list
@@ -307,23 +308,19 @@
## v0.5.1 - 2016-05-18 ## v0.5.1 - 2016-05-18
### Fixed ### Fixed
- Fix auto-updater (OS X, Windows). - Fix auto-updater (OS X, Windows).
## v0.5.0 - 2016-05-17 ## v0.5.0 - 2016-05-17
### Added ### Added
- Select/deselect individual files to torrent. - Select/deselect individual files to torrent.
- Automatically include subtitle files (.srt, .vtt) from torrent in the subtitles menu. - Automatically include subtitle files (.srt, .vtt) from torrent in the subtitles menu.
- "Add Subtitle File..." menu item. - "Add Subtitle File..." menu item.
### Changed ### Changed
- When manually adding subtitle track(s), always switch to the new track. - When manually adding subtitle track(s), always switch to the new track.
### Fixed ### Fixed
- Magnet links throw exception on app launch. (OS X) - Magnet links throw exception on app launch. (OS X)
- Multi-file torrents would not seed in-place, were copied to Downloads folder. - Multi-file torrents would not seed in-place, were copied to Downloads folder.
- Missing 'About WebTorrent' menu item. (Windows) - Missing 'About WebTorrent' menu item. (Windows)
@@ -332,7 +329,6 @@
## v0.4.0 - 2016-05-13 ## v0.4.0 - 2016-05-13
### Added ### Added
- Better Windows support! - Better Windows support!
- Windows 32-bit build. - Windows 32-bit build.
- Windows Portable App build. - Windows Portable App build.
@@ -355,7 +351,6 @@
- New default torrent on first launch: The WIRED CD. - New default torrent on first launch: The WIRED CD.
### Changed ### Changed
- Improve app startup time by 40%. - Improve app startup time by 40%.
- UI tweaks: Reduce font size, reduce torrent list item height. - UI tweaks: Reduce font size, reduce torrent list item height.
- Add Playback menu for playback-related functionality. - Add Playback menu for playback-related functionality.
@@ -366,7 +361,6 @@
- Remove "Add Fake Airplay/Chromecast" menu items. - Remove "Add Fake Airplay/Chromecast" menu items.
### Fixed ### Fixed
- Disable WebRTC to fix 100% CPU usage/crashes caused by Chromium issue. This is - Disable WebRTC to fix 100% CPU usage/crashes caused by Chromium issue. This is
temporary. (OS X) temporary. (OS X)
- When fullscreen, make controls use the full window. (OS X) - When fullscreen, make controls use the full window. (OS X)
@@ -391,24 +385,20 @@ to this release!
## v0.3.3 - 2016-04-07 ## v0.3.3 - 2016-04-07
### Fixed ### Fixed
- App icon was incorrect (OS X) - App icon was incorrect (OS X)
## v0.3.2 - 2016-04-07 ## v0.3.2 - 2016-04-07
### Added ### Added
- Register WebTorrent as default handler for magnet links (OS X) - Register WebTorrent as default handler for magnet links (OS X)
### Changed ### Changed
- Faster startup time (50ms) - Faster startup time (50ms)
- Update Electron to 0.37.5 - Update Electron to 0.37.5
- Remove the white flash when loading pages and resizing the window - Remove the white flash when loading pages and resizing the window
- Fix crash when sending IPC messages - Fix crash when sending IPC messages
### Fixed ### Fixed
- Fix installation bugs with .deb file (Linux) - Fix installation bugs with .deb file (Linux)
- Pause audio reliably when closing the window - Pause audio reliably when closing the window
- Enforce minimimum window size when resizing player (for audio-only .mov files, which are 0x0) - Enforce minimimum window size when resizing player (for audio-only .mov files, which are 0x0)
@@ -416,17 +406,14 @@ to this release!
## v0.3.1 - 2016-04-06 ## v0.3.1 - 2016-04-06
### Added ### Added
- Add crash reporter to torrent engine process - Add crash reporter to torrent engine process
### Fixed ### Fixed
- Fix cast screen background: cover, don't tile - Fix cast screen background: cover, don't tile
## v0.3.0 - 2016-04-06 ## v0.3.0 - 2016-04-06
### Added ### Added
- **Ubuntu/Debian support!** (.deb installer) - **Ubuntu/Debian support!** (.deb installer)
- **DLNA streaming support** - **DLNA streaming support**
- Add "File > Quit" menu item (Linux) - Add "File > Quit" menu item (Linux)
@@ -434,14 +421,12 @@ to this release!
- Crash reporting - Crash reporting
### Changed ### Changed
- On startup, do not re-verify files when timestamps are unchanged - On startup, do not re-verify files when timestamps are unchanged
- Moved torrent engine to an independent process, for better UI performance - Moved torrent engine to an independent process, for better UI performance
- Removed media queries (UI resizing based on window width) - Removed media queries (UI resizing based on window width)
- Improved Chromecast icon, when connected - Improved Chromecast icon, when connected
### Fixed ### Fixed
- "Download Complete" notification shows consistently - "Download Complete" notification shows consistently
- Create new torrents and seed them without copying to temporary folder - Create new torrents and seed them without copying to temporary folder
- Clicking the "Download Complete" notification will always activate app - Clicking the "Download Complete" notification will always activate app
@@ -460,7 +445,6 @@ Thanks to @dcposch, @grunjol, and @feross for contributing to this release.
## v0.2.0 - 2016-03-29 ## v0.2.0 - 2016-03-29
### Added ### Added
- Minimise to tray (Windows, Linux) - Minimise to tray (Windows, Linux)
- Show spinner and download speed when player is stalled waiting for data - Show spinner and download speed when player is stalled waiting for data
- Highlight window on drag-and-drop - Highlight window on drag-and-drop
@@ -469,12 +453,10 @@ Thanks to @dcposch, @grunjol, and @feross for contributing to this release.
Linux users need to download new versions manually. Linux users need to download new versions manually.
### Changed ### Changed
- Renamed WebTorrent.app to WebTorrent Desktop - Renamed WebTorrent.app to WebTorrent Desktop
- Add Cosmos Laundromat as a default torrent - Add Cosmos Laundromat as a default torrent
### Fixed ### Fixed
- Only capture media keys when player is active - Only capture media keys when player is active
- Update WebTorrent to 0.88.1 for performance improvements - Update WebTorrent to 0.88.1 for performance improvements
- When seeding, do not proactively connect to new peers - When seeding, do not proactively connect to new peers

View File

@@ -89,7 +89,7 @@ const all = {
// Pattern which specifies which files to ignore when copying files to create the // Pattern which specifies which files to ignore when copying files to create the
// package(s). // package(s).
ignore: /^\/src|^\/dist|\/(appveyor.yml|\.appveyor.yml|\.github|appdmg|AUTHORS|CONTRIBUTORS|bench|benchmark|benchmark\.js|bin|bower\.json|component\.json|coverage|doc|docs|docs\.mli|dragdrop\.min\.js|example|examples|example\.html|example\.js|externs|ipaddr\.min\.js|Makefile|min|minimist|perf|rusha|simplepeer\.min\.js|simplewebsocket\.min\.js|static\/screenshot\.png|test|tests|test\.js|tests\.js|webtorrent\.min\.js|\.[^\/]*|.*\.md|.*\.markdown)$/, ignore: /^\/src|^\/dist|\/(appveyor.yml|\.appveyor.yml|\.github|appdmg|AUTHORS|CONTRIBUTORS|bench|benchmark|benchmark\.js|bin|bower\.json|component\.json|coverage|doc|docs|docs\.mli|dragdrop\.min\.js|example|examples|example\.html|example\.js|externs|ipaddr\.min\.js|Makefile|min|minimist|perf|rusha|simplepeer\.min\.js|simplewebsocket\.min\.js|static\/screenshot\.png|test|tests|test\.js|tests\.js|webtorrent\.min\.js|\.[^/]*|.*\.md|.*\.markdown)$/,
// The application name. // The application name.
name: config.APP_NAME, name: config.APP_NAME,
@@ -104,8 +104,8 @@ const all = {
// "devDependencies" before starting to package the app. // "devDependencies" before starting to package the app.
prune: true, prune: true,
// The Electron version with which the app is built (without the leading 'v') // The Electron version that the app is built with (without the leading 'v')
version: require('electron/package.json').version electronVersion: require('electron/package.json').version
} }
const darwin = { const darwin = {
@@ -134,7 +134,7 @@ const win32 = {
platform: 'win32', platform: 'win32',
// Build ia32 and x64 binaries. // Build ia32 and x64 binaries.
arch: 'all', arch: ['ia32', 'x64'],
// Object hash of application metadata to embed into the executable (Windows only) // Object hash of application metadata to embed into the executable (Windows only)
win32metadata: { win32metadata: {
@@ -168,7 +168,7 @@ const linux = {
platform: 'linux', platform: 'linux',
// Build ia32 and x64 binaries. // Build ia32 and x64 binaries.
arch: 'all' arch: ['ia32', 'x64']
// Note: Application icon for Linux is specified via the BrowserWindow `icon` option. // Note: Application icon for Linux is specified via the BrowserWindow `icon` option.
} }

View File

@@ -1,7 +1,7 @@
{ {
"name": "webtorrent-desktop", "name": "webtorrent-desktop",
"description": "WebTorrent, the streaming torrent client. For Mac, Windows, and Linux.", "description": "WebTorrent, the streaming torrent client. For Mac, Windows, and Linux.",
"version": "0.17.1", "version": "0.18.0",
"author": { "author": {
"name": "WebTorrent, LLC", "name": "WebTorrent, LLC",
"email": "feross@webtorrent.io", "email": "feross@webtorrent.io",
@@ -24,13 +24,12 @@
"deep-equal": "^1.0.1", "deep-equal": "^1.0.1",
"dlnacasts": "^0.1.0", "dlnacasts": "^0.1.0",
"drag-drop": "^2.12.1", "drag-drop": "^2.12.1",
"es6-error": "^3.0.1", "es6-error": "^4.0.0",
"fn-getter": "^1.0.0", "fn-getter": "^1.0.0",
"iso-639-1": "^1.2.1", "iso-639-1": "^1.2.1",
"languagedetect": "^1.1.1", "languagedetect": "^1.1.1",
"location-history": "^1.0.0", "location-history": "^1.0.0",
"lodash.merge": "^4.6.0", "material-ui": "^0.16.0",
"material-ui": "^0.15.4",
"mkdirp": "^0.5.1", "mkdirp": "^0.5.1",
"musicmetadata": "^2.0.2", "musicmetadata": "^2.0.2",
"network-address": "^1.1.0", "network-address": "^1.1.0",
@@ -38,7 +37,7 @@
"prettier-bytes": "^1.0.1", "prettier-bytes": "^1.0.1",
"react": "^15.2.1", "react": "^15.2.1",
"react-dom": "^15.2.1", "react-dom": "^15.2.1",
"react-tap-event-plugin": "^1.0.0", "react-tap-event-plugin": "^2.0.1",
"rimraf": "^2.5.2", "rimraf": "^2.5.2",
"run-parallel": "^1.1.6", "run-parallel": "^1.1.6",
"semver": "^5.1.0", "semver": "^5.1.0",
@@ -51,16 +50,16 @@
"zero-fill": "^2.2.3" "zero-fill": "^2.2.3"
}, },
"devDependencies": { "devDependencies": {
"buble": "^0.14.0", "buble": "^0.15.2",
"cross-zip": "^2.0.1", "cross-zip": "^2.0.1",
"depcheck": "^0.6.4", "depcheck": "^0.6.4",
"electron": "1.4.2", "electron": "1.4.15",
"electron-osx-sign": "^0.3.0", "electron-osx-sign": "0.4.3",
"electron-packager": "^8.0.0", "electron-packager": "~8.5.1",
"electron-winstaller": "^2.3.0", "electron-winstaller": "~2.5.2",
"gh-release": "^2.0.3", "gh-release": "^2.0.3",
"minimist": "^1.2.0", "minimist": "^1.2.0",
"nobin-debian-installer": "^0.0.10", "nobin-debian-installer": "0.0.10",
"nodemon": "^1.10.2", "nodemon": "^1.10.2",
"open": "0.0.5", "open": "0.0.5",
"plist": "^2.0.1", "plist": "^2.0.1",
@@ -90,6 +89,7 @@
"optionalDependencies": { "optionalDependencies": {
"appdmg": "^0.4.3" "appdmg": "^0.4.3"
}, },
"private": true,
"productName": "WebTorrent", "productName": "WebTorrent",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -103,9 +103,9 @@
"package": "node ./bin/package.js", "package": "node ./bin/package.js",
"prepublish": "npm run build", "prepublish": "npm run build",
"start": "npm run build && electron .", "start": "npm run build && electron .",
"test": "standard && depcheck --ignores=buble,lodash.merge,nodemon,gh-release --ignore-dirs=build,dist && node ./bin/extra-lint.js", "test": "standard && depcheck --ignores=buble,nodemon,gh-release --ignore-dirs=build,dist && node ./bin/extra-lint.js",
"test-integration": "npm run build && node ./test", "test-integration": "npm run build && node ./test",
"update-authors": "./bin/update-authors.sh", "update-authors": "./bin/update-authors.sh",
"watch": "nodemon --exec \"npm run start\" --ext js,pug,css --ignore build/ --ignore dist/" "watch": "nodemon --exec \"npm run start\" --ext js,css --ignore build/ --ignore dist/"
} }
} }

View File

@@ -23,7 +23,7 @@ module.exports = {
CRASH_REPORT_URL: 'https://webtorrent.io/desktop/crash-report', CRASH_REPORT_URL: 'https://webtorrent.io/desktop/crash-report',
TELEMETRY_URL: 'https://webtorrent.io/desktop/telemetry', TELEMETRY_URL: 'https://webtorrent.io/desktop/telemetry',
APP_COPYRIGHT: 'Copyright © 2014-2016 ' + APP_TEAM, APP_COPYRIGHT: 'Copyright © 2014-2017 ' + APP_TEAM,
APP_FILE_ICON: path.join(__dirname, '..', 'static', 'WebTorrentFile'), APP_FILE_ICON: path.join(__dirname, '..', 'static', 'WebTorrentFile'),
APP_ICON: path.join(__dirname, '..', 'static', 'WebTorrent'), APP_ICON: path.join(__dirname, '..', 'static', 'WebTorrent'),
APP_NAME: APP_NAME, APP_NAME: APP_NAME,
@@ -60,7 +60,7 @@ module.exports = {
}, },
{ {
testID: 'wired', testID: 'wired',
name: 'The WIRED CD - Rip. Sample. Mash. Share.', name: 'The WIRED CD - Rip. Sample. Mash. Share',
posterFileName: 'wiredCd.jpg', posterFileName: 'wiredCd.jpg',
torrentFileName: 'wiredCd.torrent' torrentFileName: 'wiredCd.torrent'
} }

View File

@@ -278,6 +278,19 @@ function getMenuTemplate () {
} }
] ]
}, },
{
label: 'Transfers',
submenu: [
{
label: 'Pause All',
click: () => windows.main.dispatch('pauseAllTorrents')
},
{
label: 'Resume All',
click: () => windows.main.dispatch('resumeAllTorrents')
}
]
},
{ {
label: 'Help', label: 'Help',
role: 'help', role: 'help',
@@ -355,7 +368,7 @@ function getMenuTemplate () {
}) })
// Add Window menu (Mac) // Add Window menu (Mac)
template.splice(5, 0, { template.splice(6, 0, {
role: 'window', role: 'window',
submenu: [ submenu: [
{ {

View File

@@ -15,6 +15,7 @@ const main = module.exports = {
} }
const electron = require('electron') const electron = require('electron')
const debounce = require('debounce')
const app = electron.app const app = electron.app
@@ -31,16 +32,17 @@ function init (state, options) {
const win = main.win = new electron.BrowserWindow({ const win = main.win = new electron.BrowserWindow({
backgroundColor: '#282828', backgroundColor: '#282828',
backgroundThrottling: false, // do not throttle animations/timers when page is background
darkTheme: true, // Forces dark theme (GTK+3) darkTheme: true, // Forces dark theme (GTK+3)
height: initialBounds.height,
icon: getIconPath(), // Window icon (Windows, Linux) icon: getIconPath(), // Window icon (Windows, Linux)
minWidth: config.WINDOW_MIN_WIDTH,
minHeight: config.WINDOW_MIN_HEIGHT, minHeight: config.WINDOW_MIN_HEIGHT,
minWidth: config.WINDOW_MIN_WIDTH,
show: false,
title: config.APP_WINDOW_TITLE, title: config.APP_WINDOW_TITLE,
titleBarStyle: 'hidden-inset', // Hide title bar (Mac) titleBarStyle: 'hidden-inset', // Hide title bar (Mac)
useContentSize: true, // Specify web page size without OS chrome useContentSize: true, // Specify web page size without OS chrome
show: false,
width: initialBounds.width, width: initialBounds.width,
height: initialBounds.height,
x: initialBounds.x, x: initialBounds.x,
y: initialBounds.y y: initialBounds.y
}) })
@@ -83,13 +85,13 @@ function init (state, options) {
win.setMenuBarVisibility(true) win.setMenuBarVisibility(true)
}) })
win.on('move', function (e) { win.on('move', debounce(function (e) {
send('windowBoundsChanged', e.sender.getBounds()) send('windowBoundsChanged', e.sender.getBounds())
}) }, 1000))
win.on('resize', function (e) { win.on('resize', debounce(function (e) {
send('windowBoundsChanged', e.sender.getBounds()) send('windowBoundsChanged', e.sender.getBounds())
}) }, 1000))
win.on('close', function (e) { win.on('close', function (e) {
if (process.platform !== 'darwin') { if (process.platform !== 'darwin') {

View File

@@ -13,6 +13,7 @@ const config = require('../../config')
function init () { function init () {
const win = webtorrent.win = new electron.BrowserWindow({ const win = webtorrent.win = new electron.BrowserWindow({
backgroundColor: '#1E1E1E', backgroundColor: '#1E1E1E',
backgroundThrottling: false, // do not throttle animations/timers when page is background
center: true, center: true,
fullscreen: false, fullscreen: false,
fullscreenable: false, fullscreenable: false,

View File

@@ -17,7 +17,8 @@ module.exports = class ModalOKCancel extends React.Component {
className='control ok' className='control ok'
primary primary
label={okText} label={okText}
onClick={onOK} /> onClick={onOK}
autoFocus />
</div> </div>
) )
} }

View File

@@ -1,7 +1,5 @@
const electron = require('electron') const {ipcRenderer} = require('electron')
const telemetry = require('../lib/telemetry')
const ipcRenderer = electron.ipcRenderer
const Playlist = require('../lib/playlist') const Playlist = require('../lib/playlist')
// Controls local play back: the <video>/<audio> tag and VLC // Controls local play back: the <video>/<audio> tag and VLC
@@ -12,7 +10,7 @@ module.exports = class MediaController {
} }
mediaSuccess () { mediaSuccess () {
this.state.playing.result = 'success' telemetry.logPlayAttempt('success')
} }
mediaStalled () { mediaStalled () {
@@ -22,7 +20,7 @@ module.exports = class MediaController {
mediaError (error) { mediaError (error) {
const state = this.state const state = this.state
if (state.location.url() === 'player') { if (state.location.url() === 'player') {
state.playing.result = 'error' telemetry.logPlayAttempt('error')
state.playing.location = 'error' state.playing.location = 'error'
ipcRenderer.send('checkForExternalPlayer', state.saved.prefs.externalPlayerPath) ipcRenderer.send('checkForExternalPlayer', state.saved.prefs.externalPlayerPath)
ipcRenderer.once('checkForExternalPlayer', function (e, isInstalled) { ipcRenderer.once('checkForExternalPlayer', function (e, isInstalled) {
@@ -58,7 +56,10 @@ module.exports = class MediaController {
const state = this.state const state = this.state
state.playing.location = 'external' state.playing.location = 'external'
let open = function () { const onServerRunning = function () {
state.playing.isReady = true
telemetry.logPlayAttempt('external')
const mediaURL = Playlist.getCurrentLocalURL(state) const mediaURL = Playlist.getCurrentLocalURL(state)
ipcRenderer.send('openExternalPlayer', ipcRenderer.send('openExternalPlayer',
state.saved.prefs.externalPlayerPath, state.saved.prefs.externalPlayerPath,
@@ -66,8 +67,8 @@ module.exports = class MediaController {
state.window.title) state.window.title)
} }
if (state.server != null) open() if (state.server != null) onServerRunning()
else ipcRenderer.once('wt-server-running', open) else ipcRenderer.once('wt-server-running', onServerRunning)
} }
externalPlayerNotFound () { externalPlayerNotFound () {

View File

@@ -211,6 +211,7 @@ module.exports = class PlaybackController {
const torrentSummary = TorrentSummary.getByKey(state, infoHash) const torrentSummary = TorrentSummary.getByKey(state, infoHash)
state.playing.infoHash = torrentSummary.infoHash state.playing.infoHash = torrentSummary.infoHash
state.playing.isReady = false
// update UI to show pending playback // update UI to show pending playback
sound.play('PLAY') sound.play('PLAY')
@@ -222,6 +223,8 @@ module.exports = class PlaybackController {
// Starts WebTorrent server for media streaming // Starts WebTorrent server for media streaming
startServer (torrentSummary) { startServer (torrentSummary) {
const state = this.state
if (torrentSummary.status === 'paused') { if (torrentSummary.status === 'paused') {
dispatch('startTorrentingSummary', torrentSummary.torrentKey) dispatch('startTorrentingSummary', torrentSummary.torrentKey)
ipcRenderer.once('wt-ready-' + torrentSummary.infoHash, ipcRenderer.once('wt-ready-' + torrentSummary.infoHash,
@@ -232,6 +235,7 @@ module.exports = class PlaybackController {
function onTorrentReady () { function onTorrentReady () {
ipcRenderer.send('wt-start-server', torrentSummary.infoHash) ipcRenderer.send('wt-start-server', torrentSummary.infoHash)
ipcRenderer.once('wt-server-running', () => { state.playing.isReady = true })
} }
} }
@@ -268,8 +272,16 @@ module.exports = class PlaybackController {
state.playing.jumpToTime = jumpToTime state.playing.jumpToTime = jumpToTime
// if it's audio, parse out the metadata (artist, title, etc) // if it's audio, parse out the metadata (artist, title, etc)
if (state.playing.type === 'audio' && !fileSummary.audioInfo) { if (torrentSummary.status === 'paused') {
ipcRenderer.send('wt-get-audio-metadata', torrentSummary.infoHash, index) ipcRenderer.once('wt-ready-' + torrentSummary.infoHash, getAudioMetadata)
} else {
getAudioMetadata()
}
function getAudioMetadata () {
if (state.playing.type === 'audio' && !fileSummary.audioInfo) {
ipcRenderer.send('wt-get-audio-metadata', torrentSummary.infoHash, index)
}
} }
// if it's video, check for subtitles files that are done downloading // if it's video, check for subtitles files that are done downloading
@@ -312,12 +324,7 @@ module.exports = class PlaybackController {
// Save volume (this session only, not in state.saved) // Save volume (this session only, not in state.saved)
state.previousVolume = state.playing.volume state.previousVolume = state.playing.volume
// Telemetry: track what happens after the user clicks play if (!state.playing.isReady) telemetry.logPlayAttempt('abandoned') // user gave up waiting
const result = state.playing.result // 'success' or 'error'
if (result === 'success') telemetry.logPlayAttempt('success') // first frame displayed
else if (result === 'error') telemetry.logPlayAttempt('error') // codec missing, etc
else if (result === undefined) telemetry.logPlayAttempt('abandoned') // user gave up waiting
else console.error('Unknown state.playing.result', state.playing.result)
// Reset the window contents back to the home screen // Reset the window contents back to the home screen
state.playing = State.getDefaultPlayState() state.playing = State.getDefaultPlayState()

View File

@@ -128,6 +128,27 @@ module.exports = class TorrentListController {
} }
} }
pauseAllTorrents () {
this.state.saved.torrents.forEach((torrentSummary) => {
if (torrentSummary.status === 'downloading' ||
torrentSummary.status === 'seeding') {
torrentSummary.status = 'paused'
ipcRenderer.send('wt-stop-torrenting', torrentSummary.infoHash)
}
})
sound.play('DISABLE')
}
resumeAllTorrents () {
this.state.saved.torrents.forEach((torrentSummary) => {
if (torrentSummary.status === 'paused') {
torrentSummary.status = 'downloading'
this.startTorrentingSummary(torrentSummary.torrentKey)
}
})
sound.play('ENABLE')
}
toggleTorrentFile (infoHash, index) { toggleTorrentFile (infoHash, index) {
const torrentSummary = TorrentSummary.getByKey(this.state, infoHash) const torrentSummary = TorrentSummary.getByKey(this.state, infoHash)
torrentSummary.selections[index] = !torrentSummary.selections[index] torrentSummary.selections[index] = !torrentSummary.selections[index]
@@ -220,7 +241,8 @@ module.exports = class TorrentListController {
menu.append(new electron.remote.MenuItem({ menu.append(new electron.remote.MenuItem({
label: 'Save Torrent File As...', label: 'Save Torrent File As...',
click: () => dispatch('saveTorrentFileAs', torrentSummary.torrentKey) click: () => dispatch('saveTorrentFileAs', torrentSummary.torrentKey),
enabled: torrentSummary.torrentFileName != null
})) }))
menu.popup(electron.remote.getCurrentWindow()) menu.popup(electron.remote.getCurrentWindow())

View File

@@ -388,7 +388,8 @@ function toggleMenu (location) {
if (state.playing.location !== 'local') { if (state.playing.location !== 'local') {
throw new CastingError( throw new CastingError(
`You can't connect to ${location} when already connected to another device` `You can't connect to ${location} when already connected to another device`
) } )
}
// Find all cast devices of the given type // Find all cast devices of the given type
const player = getPlayer(location) const player = getPlayer(location)

View File

@@ -5,6 +5,7 @@ module.exports = {
} }
const fs = require('fs') const fs = require('fs')
const path = require('path')
const semver = require('semver') const semver = require('semver')
const config = require('../../config') const config = require('../../config')
@@ -18,30 +19,15 @@ function run (state) {
} }
const version = state.saved.version const version = state.saved.version
const saved = state.saved
if (semver.lt(version, '0.7.0')) { if (semver.lt(version, '0.7.0')) migrate_0_7_0(saved)
migrate_0_7_0(state.saved) if (semver.lt(version, '0.7.2')) migrate_0_7_2(saved)
} if (semver.lt(version, '0.11.0')) migrate_0_11_0(saved)
if (semver.lt(version, '0.12.0')) migrate_0_12_0(saved)
if (semver.lt(version, '0.7.2')) { if (semver.lt(version, '0.14.0')) migrate_0_14_0(saved)
migrate_0_7_2(state.saved) 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.11.0')) {
migrate_0_11_0(state.saved)
}
if (semver.lt(version, '0.12.0')) {
migrate_0_12_0(state.saved)
}
if (semver.lt(version, '0.14.0')) {
migrate_0_14_0(state.saved)
}
if (semver.lt(version, '0.17.0')) {
migrate_0_17_0(state.saved)
}
// Config is now on the new version // Config is now on the new version
state.saved.version = config.APP_VERSION state.saved.version = config.APP_VERSION
@@ -163,3 +149,60 @@ function migrate_0_17_0 (saved) {
}) })
}) })
} }
function migrate_0_17_2 (saved) {
// Remove the trailing dot (.) from the Wired CD torrent name, since
// folders/files that end in a trailing dot (.) or space are not deletable from
// Windows Explorer. See: https://github.com/feross/webtorrent-desktop/issues/905
const cpFile = require('cp-file')
const rimraf = require('rimraf')
const OLD_NAME = 'The WIRED CD - Rip. Sample. Mash. Share.'
const NEW_NAME = 'The WIRED CD - Rip. Sample. Mash. Share'
const OLD_HASH = '3ba219a8634bf7bae3d848192b2da75ae995589d'
const NEW_HASH = 'a88fda5954e89178c372716a6a78b8180ed4dad3'
const ts = saved.torrents.find((ts) => {
return ts.infoHash === OLD_HASH
})
if (!ts) return // Wired CD torrent does not exist
// New versions of WebTorrent ship with a fixed torrent file. Let's fix up the
// name in existing versions of WebTorrent.
ts.name = ts.displayName = NEW_NAME
ts.files.forEach((file) => {
file.path = file.path.replace(OLD_NAME, NEW_NAME)
})
// Changing the torrent name causes the info hash to change
ts.infoHash = NEW_HASH
ts.magnetURI = ts.magnetURI.replace(OLD_HASH, NEW_HASH)
try {
fs.renameSync(
path.join(config.POSTER_PATH, ts.posterFileName),
path.join(config.POSTER_PATH, NEW_HASH + '.jpg')
)
} catch (err) {}
ts.posterFileName = NEW_HASH + '.jpg'
rimraf.sync(path.join(config.TORRENT_PATH, ts.torrentFileName))
cpFile.sync(
path.join(config.STATIC_PATH, 'wiredCd.torrent'),
path.join(config.TORRENT_PATH, NEW_HASH + '.torrent')
)
ts.torrentFileName = NEW_HASH + '.torrent'
if (ts.path) {
// If torrent folder already exists on disk, try to rename it
try {
fs.renameSync(
path.join(ts.path, OLD_NAME),
path.join(ts.path, NEW_NAME)
)
} catch (err) {}
}
}

View File

@@ -92,6 +92,7 @@ function getDefaultPlayState () {
type: null, /* 'audio' or 'video', could be 'other' if ever support eg streaming to VLC */ type: null, /* 'audio' or 'video', could be 'other' if ever support eg streaming to VLC */
currentTime: 0, /* seconds */ currentTime: 0, /* seconds */
duration: 1, /* seconds */ duration: 1, /* seconds */
isReady: false,
isPaused: true, isPaused: true,
isStalled: false, isStalled: false,
lastTimeUpdate: 0, /* Unix time in ms */ lastTimeUpdate: 0, /* Unix time in ms */

View File

@@ -66,8 +66,8 @@ function reset () {
minVersion: config.APP_VERSION, minVersion: config.APP_VERSION,
total: 0, total: 0,
success: 0, success: 0,
timeout: 0,
error: 0, error: 0,
external: 0,
abandoned: 0 abandoned: 0
} }
} }
@@ -210,10 +210,10 @@ function getElemString (elem) {
return ret return ret
} }
// The user pressed play. It either worked, timed out, or showed the // The user pressed play. Did it work, display an error,
// 'Play in VLC' codec error // open an external player or did user abandon the attempt?
function logPlayAttempt (result) { function logPlayAttempt (result) {
if (!['success', 'timeout', 'error', 'abandoned'].includes(result)) { if (!['success', 'error', 'external', 'abandoned'].includes(result)) {
return console.error('Unknown play attempt result', result) return console.error('Unknown play attempt result', result)
} }

View File

@@ -1,10 +1,6 @@
/** /**
* Perf optimization: Hook into require() to modify how certain modules load: * Perf optimization: Hook into require() to modify how certain modules load:
* *
* - `lodash/merge` (used by `material-ui`) causes 119 require() calls at startup,
* which take ~100ms. Replace it with `lodash.merge` which is equivalent.
* See: https://github.com/callemall/material-ui/pull/4380#issuecomment-250894552
*
* - `inline-style-prefixer` (used by `material-ui`) takes ~40ms. It is not * - `inline-style-prefixer` (used by `material-ui`) takes ~40ms. It is not
* actually used because auto-prefixing is disabled with * actually used because auto-prefixing is disabled with
* `darkBaseTheme.userAgent = false`. Return a fake object. * `darkBaseTheme.userAgent = false`. Return a fake object.
@@ -12,7 +8,6 @@
let Module = require('module') let Module = require('module')
const _require = Module.prototype.require const _require = Module.prototype.require
Module.prototype.require = function (id) { Module.prototype.require = function (id) {
if (id === 'lodash/merge') id = 'lodash.merge'
if (id === 'inline-style-prefixer') return {} if (id === 'inline-style-prefixer') return {}
return _require.apply(this, arguments) return _require.apply(this, arguments)
} }
@@ -230,6 +225,8 @@ const dispatchHandlers = {
'showCreateTorrent': (paths) => controllers.torrentList().showCreateTorrent(paths), 'showCreateTorrent': (paths) => controllers.torrentList().showCreateTorrent(paths),
'createTorrent': (options) => controllers.torrentList().createTorrent(options), 'createTorrent': (options) => controllers.torrentList().createTorrent(options),
'toggleTorrent': (infoHash) => controllers.torrentList().toggleTorrent(infoHash), 'toggleTorrent': (infoHash) => controllers.torrentList().toggleTorrent(infoHash),
'pauseAllTorrents': () => controllers.torrentList().pauseAllTorrents(),
'resumeAllTorrents': () => controllers.torrentList().resumeAllTorrents(),
'toggleTorrentFile': (infoHash, index) => 'toggleTorrentFile': (infoHash, index) =>
controllers.torrentList().toggleTorrentFile(infoHash, index), controllers.torrentList().toggleTorrentFile(infoHash, index),
'confirmDeleteTorrent': (infoHash, deleteData) => 'confirmDeleteTorrent': (infoHash, deleteData) =>
@@ -475,8 +472,10 @@ function onError (err) {
update() update()
} }
const editableHtmlTags = new Set(['input', 'textarea'])
function onPaste (e) { function onPaste (e) {
if (e.target.tagName.toLowerCase() === 'input') return if (editableHtmlTags.has(e.target.tagName.toLowerCase())) return
controllers.torrentList().addTorrent(electron.clipboard.readText()) controllers.torrentList().addTorrent(electron.clipboard.readText())
update() update()

View File

@@ -275,9 +275,9 @@ function renderLoadingSpinner (state) {
<div key='loading' className='media-stalled'> <div key='loading' className='media-stalled'>
<div key='loading-spinner' className='loading-spinner'>&nbsp;</div> <div key='loading-spinner' className='loading-spinner'>&nbsp;</div>
<div key='loading-progress' className='loading-status ellipsis'> <div key='loading-progress' className='loading-status ellipsis'>
<span className='progress'>{fileProgress}%</span> downloaded, <span className='progress'>{fileProgress}%</span> downloaded
<span> {prettyBytes(prog.downloadSpeed || 0)}/s</span> <span> {prettyBytes(prog.downloadSpeed || 0)}/s</span>
<span> {prettyBytes(prog.uploadSpeed || 0)}/s</span> <span> {prettyBytes(prog.uploadSpeed || 0)}/s</span>
</div> </div>
</div> </div>
) )
@@ -599,12 +599,15 @@ function renderLoadingBar (state) {
const torrentSummary = state.getPlayingTorrentSummary() const torrentSummary = state.getPlayingTorrentSummary()
if (!torrentSummary.progress) { if (!torrentSummary.progress) {
return [] return null
} }
// Find all contiguous parts of the torrent which are loaded // Find all contiguous parts of the torrent which are loaded
const prog = torrentSummary.progress const prog = torrentSummary.progress
const fileProg = prog.files[state.playing.fileIndex] const fileProg = prog.files[state.playing.fileIndex]
if (!fileProg) return null
const parts = [] const parts = []
let lastPiecePresent = false let lastPiecePresent = false
for (let i = fileProg.startPiece; i <= fileProg.endPiece; i++) { for (let i = fileProg.startPiece; i <= fileProg.endPiece; i++) {
@@ -626,6 +629,7 @@ function renderLoadingBar (state) {
return (<div key={i} className='loading-bar-part' style={style} />) return (<div key={i} className='loading-bar-part' style={style} />)
}) })
return (<div key='loading-bar' className='loading-bar'>{loadingBarElems}</div>) return (<div key='loading-bar' className='loading-bar'>{loadingBarElems}</div>)
} }

View File

@@ -125,8 +125,6 @@ function startTorrenting (torrentKey, torrentID, path, fileModtimes, selections)
// Only download the files the user wants, not necessarily all files // Only download the files the user wants, not necessarily all files
torrent.once('ready', () => selectFiles(torrent, selections)) torrent.once('ready', () => selectFiles(torrent, selections))
return torrent
} }
function stopTorrenting (infoHash) { function stopTorrenting (infoHash) {

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1010 KiB

After

Width:  |  Height:  |  Size: 1011 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 698 KiB

After

Width:  |  Height:  |  Size: 698 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 478 KiB

After

Width:  |  Height:  |  Size: 479 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 480 KiB

After

Width:  |  Height:  |  Size: 480 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 480 KiB

After

Width:  |  Height:  |  Size: 480 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 480 KiB

After

Width:  |  Height:  |  Size: 480 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 481 KiB

After

Width:  |  Height:  |  Size: 481 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 627 KiB

After

Width:  |  Height:  |  Size: 627 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 843 KiB

After

Width:  |  Height:  |  Size: 844 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1014 KiB

After

Width:  |  Height:  |  Size: 1014 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 549 KiB

After

Width:  |  Height:  |  Size: 549 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 698 KiB

After

Width:  |  Height:  |  Size: 698 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1024 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1014 KiB

After

Width:  |  Height:  |  Size: 1014 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1015 KiB

After

Width:  |  Height:  |  Size: 1016 KiB

View File

@@ -38,11 +38,12 @@ test('create-torrent', function (t) {
const expectedTorrent = { const expectedTorrent = {
announce: [ announce: [
'udp://exodus.desync.com:6969', 'udp://explodie.org:6969',
'udp://tracker.coppersurfer.tk:6969', 'udp://tracker.coppersurfer.tk:6969',
'udp://tracker.internetwarriors.net:1337',
'udp://tracker.leechers-paradise.org:6969', 'udp://tracker.leechers-paradise.org:6969',
'udp://tracker.openbittorrent.com:80', 'udp://tracker.openbittorrent.com:80',
'udp://tracker.opentrackr.org:1337',
'udp://zer0day.ch:1337',
'wss://tracker.btorrent.xyz', 'wss://tracker.btorrent.xyz',
'wss://tracker.fastcast.nz', 'wss://tracker.fastcast.nz',
'wss://tracker.openwebtorrent.com' 'wss://tracker.openwebtorrent.com'