suppress load video error #1768

Merged
daovist merged 6 commits from suppress-load-video-error into master 2018-07-19 16:42:24 +02:00
6 changed files with 43 additions and 25 deletions

View file

@ -11,11 +11,11 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
### Changed ### 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)) * 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)) * 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 ## [0.22.2] - 2018-07-09
### Fixed ### Fixed

View file

@ -48,7 +48,7 @@
"formik": "^0.10.4", "formik": "^0.10.4",
"hast-util-sanitize": "^1.1.2", "hast-util-sanitize": "^1.1.2",
"keytar": "^4.2.1", "keytar": "^4.2.1",
"lbry-redux": "lbryio/lbry-redux#177ef2c1916f9672e713267500e447d671ae1bc3", "lbry-redux": "lbryio/lbry-redux#e0909b08647a790d155f3189b9f9bf0b3e55bd17",
"localforage": "^1.7.1", "localforage": "^1.7.1",
"mime": "^2.3.1", "mime": "^2.3.1",
"mixpanel-browser": "^2.17.1", "mixpanel-browser": "^2.17.1",

View file

@ -17,6 +17,7 @@ import {
import { makeSelectClientSetting, selectShowNsfw } from 'redux/selectors/settings'; import { makeSelectClientSetting, selectShowNsfw } from 'redux/selectors/settings';
import { selectMediaPaused, makeSelectMediaPositionForUri } from 'redux/selectors/media'; import { selectMediaPaused, makeSelectMediaPositionForUri } from 'redux/selectors/media';
import { selectPlayingUri } from 'redux/selectors/content'; import { selectPlayingUri } from 'redux/selectors/content';
import { selectFileInfoErrors } from 'redux/selectors/file_info';
import FileViewer from './view'; import FileViewer from './view';
const select = (state, props) => ({ const select = (state, props) => ({
@ -34,6 +35,7 @@ const select = (state, props) => ({
mediaPosition: makeSelectMediaPositionForUri(props.uri)(state), mediaPosition: makeSelectMediaPositionForUri(props.uri)(state),
autoplay: makeSelectClientSetting(settings.AUTOPLAY)(state), autoplay: makeSelectClientSetting(settings.AUTOPLAY)(state),
searchBarFocused: selectSearchBarFocused(state), searchBarFocused: selectSearchBarFocused(state),
fileInfoErrors: selectFileInfoErrors(state)
}); });
const perform = dispatch => ({ const perform = dispatch => ({

View file

@ -17,6 +17,9 @@ type Props = {
download_path: string, download_path: string,
completed: boolean, completed: boolean,
}, },
fileInfoErrors: ?{
[string]: boolean,
},
metadata: ?{ metadata: ?{
nsfw: boolean, nsfw: boolean,
thumbnail: string, thumbnail: string,
@ -55,14 +58,17 @@ class FileViewer extends React.PureComponent<Props> {
window.addEventListener('keydown', this.handleKeyDown); window.addEventListener('keydown', this.handleKeyDown);
} }
componentWillReceiveProps(nextProps: Props) { componentDidUpdate(prev: Props) {
if ( if (
this.props.autoplay !== nextProps.autoplay || this.props.autoplay !== prev.autoplay ||
this.props.fileInfo !== nextProps.fileInfo || this.props.fileInfo !== prev.fileInfo ||
this.props.isDownloading !== nextProps.isDownloading || this.props.isDownloading !== prev.isDownloading ||
this.props.playingUri !== nextProps.playingUri 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);
}
} }
} }

View file

@ -171,7 +171,7 @@ export function doUpdateLoadStatus(uri, outpoint) {
} else { } else {
// ready to play // ready to play
const { total_bytes: totalBytes, written_bytes: writtenBytes } = fileInfo; const { total_bytes: totalBytes, written_bytes: writtenBytes } = fileInfo;
const progress = writtenBytes / totalBytes * 100; const progress = (writtenBytes / totalBytes) * 100;
dispatch({ dispatch({
type: ACTIONS.DOWNLOADING_PROGRESSED, type: ACTIONS.DOWNLOADING_PROGRESSED,
@ -259,29 +259,37 @@ export function doLoadVideo(uri) {
streamInfo === null || typeof streamInfo !== 'object' || streamInfo.error === 'Timeout'; streamInfo === null || typeof streamInfo !== 'object' || streamInfo.error === 'Timeout';
if (timeout) { if (timeout) {
dispatch(doSetPlayingUri(null)); dispatch(handleLoadVideoError(uri, 'timeout'));
dispatch({
type: ACTIONS.LOADING_VIDEO_FAILED,
data: { uri },
});
dispatch(doNotify({ id: MODALS.FILE_TIMEOUT }, { uri }));
} else { } else {
dispatch(doDownloadFile(uri, streamInfo)); dispatch(doDownloadFile(uri, streamInfo));
} }
}) })
.catch(() => { .catch(() => {
dispatch(doSetPlayingUri(null)); dispatch(handleLoadVideoError(uri));
dispatch({ });
type: ACTIONS.LOADING_VIDEO_FAILED, };
data: { 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( dispatch(
doAlertError( doAlertError(
`Failed to download ${uri}, please try again. If this problem persists, visit https://lbry.io/faq/support for support.` `Failed to download ${uri}, please try again. If this problem persists, visit https://lbry.io/faq/support for support.`
) )
); );
}); }
}
}; };
} }

View file

@ -3,9 +3,9 @@ import {
selectIsFetchingClaimListMine, selectIsFetchingClaimListMine,
selectMyClaims, selectMyClaims,
selectClaimsById, selectClaimsById,
} from 'redux/selectors/claims'; buildURI,
} from 'lbry-redux';
import { createSelector } from 'reselect'; import { createSelector } from 'reselect';
import { buildURI } from 'lbryURI';
export const selectState = state => state.fileInfo || {}; export const selectState = state => state.fileInfo || {};
@ -97,7 +97,7 @@ export const selectTotalDownloadProgress = createSelector(selectDownloadingFileI
const progress = []; const progress = [];
fileInfos.forEach(fileInfo => { 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); const totalProgress = progress.reduce((a, b) => a + b, 0);
@ -195,3 +195,5 @@ export const selectSearchDownloadUris = query =>
}) })
: null; : null;
}); });
export const selectFileInfoErrors = createSelector(selectState, state => state.errors || {});