From d43dd7882192f0481df8126016181eedcd0aa946 Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Thu, 12 Jul 2018 15:37:01 -0400 Subject: [PATCH] suppress load video error; disable autoplay per-video after download failure --- src/renderer/component/fileViewer/index.js | 2 ++ src/renderer/component/fileViewer/view.jsx | 16 ++++++++-- src/renderer/redux/actions/content.js | 36 +++++++++++++--------- src/renderer/redux/selectors/file_info.js | 8 +++-- 4 files changed, 43 insertions(+), 19 deletions(-) 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..0a16d9f92 100644 --- a/src/renderer/component/fileViewer/view.jsx +++ b/src/renderer/component/fileViewer/view.jsx @@ -79,10 +79,22 @@ class FileViewer extends React.PureComponent { } } + // do not play when state.content.errors[uri] handleAutoplay = (props: Props) => { - const { autoplay, playingUri, fileInfo, costInfo, isDownloading, uri, play, metadata } = props; + const { + autoplay, + playingUri, + fileInfo, + costInfo, + isDownloading, + uri, + play, + metadata, + fileInfoErrors, + } = props; - const playable = autoplay && playingUri !== uri && metadata && !metadata.nsfw; + const playable = + autoplay && playingUri !== uri && metadata && !metadata.nsfw && !(uri in fileInfoErrors); if (playable && costInfo && costInfo.cost === 0 && !fileInfo && !isDownloading) { play(uri); diff --git a/src/renderer/redux/actions/content.js b/src/renderer/redux/actions/content.js index f16d89f6f..c50bff457 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 || {});