diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a7b323c4..502730a1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,11 +14,11 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/). ### Changed + * Only show video error modal if you are on the video page & don't retry to play failed videos ([#1768](https://github.com/lbryio/lbry-desktop/pull/1768)) * Actually hide NSFW files if a user chooses to hide NSFW content via the settings page ([#1748](https://github.com/lbryio/lbry-desktop/pull/1748)) * Hide the "Community top bids" section if user chooses to hide NSFW content ([#1760](https://github.com/lbryio/lbry-desktop/pull/1760)) - ## [0.22.2] - 2018-07-09 ### Fixed diff --git a/package.json b/package.json index 0300cf5d0..da2241252 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "formik": "^0.10.4", "hast-util-sanitize": "^1.1.2", "keytar": "^4.2.1", - "lbry-redux": "lbryio/lbry-redux#177ef2c1916f9672e713267500e447d671ae1bc3", + "lbry-redux": "lbryio/lbry-redux#e0909b08647a790d155f3189b9f9bf0b3e55bd17", "localforage": "^1.7.1", "mime": "^2.3.1", "mixpanel-browser": "^2.17.1", diff --git a/src/renderer/component/fileViewer/index.js b/src/renderer/component/fileViewer/index.js index 00ef7c3c0..2e77b38d4 100644 --- a/src/renderer/component/fileViewer/index.js +++ b/src/renderer/component/fileViewer/index.js @@ -17,6 +17,7 @@ import { import { makeSelectClientSetting, selectShowNsfw } from 'redux/selectors/settings'; import { selectMediaPaused, makeSelectMediaPositionForUri } from 'redux/selectors/media'; import { selectPlayingUri } from 'redux/selectors/content'; +import { selectFileInfoErrors } from 'redux/selectors/file_info'; import FileViewer from './view'; const select = (state, props) => ({ @@ -34,6 +35,7 @@ const select = (state, props) => ({ mediaPosition: makeSelectMediaPositionForUri(props.uri)(state), autoplay: makeSelectClientSetting(settings.AUTOPLAY)(state), searchBarFocused: selectSearchBarFocused(state), + fileInfoErrors: selectFileInfoErrors(state) }); const perform = dispatch => ({ diff --git a/src/renderer/component/fileViewer/view.jsx b/src/renderer/component/fileViewer/view.jsx index 2a0d9f53d..406c25186 100644 --- a/src/renderer/component/fileViewer/view.jsx +++ b/src/renderer/component/fileViewer/view.jsx @@ -17,6 +17,9 @@ type Props = { download_path: string, completed: boolean, }, + fileInfoErrors: ?{ + [string]: boolean, + }, metadata: ?{ nsfw: boolean, thumbnail: string, @@ -55,14 +58,17 @@ class FileViewer extends React.PureComponent<Props> { window.addEventListener('keydown', this.handleKeyDown); } - componentWillReceiveProps(nextProps: Props) { + componentDidUpdate(prev: Props) { if ( - this.props.autoplay !== nextProps.autoplay || - this.props.fileInfo !== nextProps.fileInfo || - this.props.isDownloading !== nextProps.isDownloading || - this.props.playingUri !== nextProps.playingUri + this.props.autoplay !== prev.autoplay || + this.props.fileInfo !== prev.fileInfo || + this.props.isDownloading !== prev.isDownloading || + this.props.playingUri !== prev.playingUri ) { - this.handleAutoplay(nextProps); + // suppress autoplay after download error + if (!(this.props.uri in this.props.fileInfoErrors)) { + this.handleAutoplay(this.props); + } } } diff --git a/src/renderer/redux/actions/content.js b/src/renderer/redux/actions/content.js index f16d89f6f..04808b6e1 100644 --- a/src/renderer/redux/actions/content.js +++ b/src/renderer/redux/actions/content.js @@ -171,7 +171,7 @@ export function doUpdateLoadStatus(uri, outpoint) { } else { // ready to play const { total_bytes: totalBytes, written_bytes: writtenBytes } = fileInfo; - const progress = writtenBytes / totalBytes * 100; + const progress = (writtenBytes / totalBytes) * 100; dispatch({ type: ACTIONS.DOWNLOADING_PROGRESSED, @@ -259,29 +259,37 @@ export function doLoadVideo(uri) { streamInfo === null || typeof streamInfo !== 'object' || streamInfo.error === 'Timeout'; if (timeout) { - dispatch(doSetPlayingUri(null)); - dispatch({ - type: ACTIONS.LOADING_VIDEO_FAILED, - data: { uri }, - }); - - dispatch(doNotify({ id: MODALS.FILE_TIMEOUT }, { uri })); + dispatch(handleLoadVideoError(uri, 'timeout')); } else { dispatch(doDownloadFile(uri, streamInfo)); } }) .catch(() => { - dispatch(doSetPlayingUri(null)); - dispatch({ - type: ACTIONS.LOADING_VIDEO_FAILED, - data: { uri }, - }); + dispatch(handleLoadVideoError(uri)); + }); + }; +} + +function handleLoadVideoError(uri, errorType = '') { + return (dispatch, getState) => { + // suppress error when another media is playing + const { playingUri } = getState().content; + if (playingUri && playingUri === uri) { + dispatch({ + type: ACTIONS.LOADING_VIDEO_FAILED, + data: { uri }, + }); + dispatch(doSetPlayingUri(null)); + if (errorType === 'timeout') { + doNotify({ id: MODALS.FILE_TIMEOUT }, { uri }); + } else { dispatch( doAlertError( `Failed to download ${uri}, please try again. If this problem persists, visit https://lbry.io/faq/support for support.` ) ); - }); + } + } }; } diff --git a/src/renderer/redux/selectors/file_info.js b/src/renderer/redux/selectors/file_info.js index 801ced0b4..d49f2e9a2 100644 --- a/src/renderer/redux/selectors/file_info.js +++ b/src/renderer/redux/selectors/file_info.js @@ -3,9 +3,9 @@ import { selectIsFetchingClaimListMine, selectMyClaims, selectClaimsById, -} from 'redux/selectors/claims'; + buildURI, +} from 'lbry-redux'; import { createSelector } from 'reselect'; -import { buildURI } from 'lbryURI'; export const selectState = state => state.fileInfo || {}; @@ -97,7 +97,7 @@ export const selectTotalDownloadProgress = createSelector(selectDownloadingFileI const progress = []; fileInfos.forEach(fileInfo => { - progress.push(fileInfo.written_bytes / fileInfo.total_bytes * 100); + progress.push((fileInfo.written_bytes / fileInfo.total_bytes) * 100); }); const totalProgress = progress.reduce((a, b) => a + b, 0); @@ -195,3 +195,5 @@ export const selectSearchDownloadUris = query => }) : null; }); + +export const selectFileInfoErrors = createSelector(selectState, state => state.errors || {});