update publishing messages: (#3794)

increase lbrytv limit until tv transcoding
warn about bitrate
warn about strange types
more reliably convey size limit message
This commit is contained in:
jessopb 2020-03-06 18:11:16 -05:00 committed by GitHub
parent f07182bca3
commit 815ab193aa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 157 additions and 24 deletions

View file

@ -2,5 +2,6 @@ declare type WebFile = {
name: string, name: string,
title?: string, title?: string,
path?: string, path?: string,
size?: string, size: string,
type: string,
} }

View file

@ -1003,7 +1003,6 @@
"Model": "Model", "Model": "Model",
"Binary": "Binary", "Binary": "Binary",
"Other": "Other", "Other": "Other",
"For video content, use MP4s in H264/AAC format and a friendly bitrate (720p) for more reliable streaming.": "For video content, use MP4s in H264/AAC format and a friendly bitrate (720p) for more reliable streaming.",
"Show reposts": "Show reposts", "Show reposts": "Show reposts",
"Show reposts from the creators you follow.": "Show reposts from the creators you follow.", "Show reposts from the creators you follow.": "Show reposts from the creators you follow.",
"You can try refreshing to fix it. If you still have issues, your anti-virus software or firewall may be preventing startup.": "You can try refreshing to fix it. If you still have issues, your anti-virus software or firewall may be preventing startup.", "You can try refreshing to fix it. If you still have issues, your anti-virus software or firewall may be preventing startup.": "You can try refreshing to fix it. If you still have issues, your anti-virus software or firewall may be preventing startup.",
@ -1017,5 +1016,15 @@
"Add tags that are relevant to your content. If mature content, ensure it is tagged mature. Tag abuse and missing mature tags will not be tolerated.": "Add tags that are relevant to your content. If mature content, ensure it is tagged mature. Tag abuse and missing mature tags will not be tolerated.", "Add tags that are relevant to your content. If mature content, ensure it is tagged mature. Tag abuse and missing mature tags will not be tolerated.": "Add tags that are relevant to your content. If mature content, ensure it is tagged mature. Tag abuse and missing mature tags will not be tolerated.",
"%selectTagsLabel% (%number% left)": "%selectTagsLabel% (%number% left)", "%selectTagsLabel% (%number% left)": "%selectTagsLabel% (%number% left)",
"Matching": "Matching", "Matching": "Matching",
"No matching tags": "No matching tags" "No matching tags": "No matching tags",
"Please check your deposit amount.": "Please check your deposit amount.",
"For video content, use MP4s in H264/AAC format and a friendly bitrate (1080p) for more reliable streaming.": "For video content, use MP4s in H264/AAC format and a friendly bitrate (1080p) for more reliable streaming.",
"Checking your video...": "Checking your video...",
"Your video may not be the best format. Use MP4s in H264/AAC format and a friendly bitrate (1080p) for more reliable streaming.": "Your video may not be the best format. Use MP4s in H264/AAC format and a friendly bitrate (1080p) for more reliable streaming.",
"Publishing Guide": "Publishing Guide",
"This is equivalent to a password. Do not post or share this.": "This is equivalent to a password. Do not post or share this.",
"For video content, use MP4s in H264/AAC format and a friendly bitrate (720p) for more reliable streaming.": "For video content, use MP4s in H264/AAC format and a friendly bitrate (720p) for more reliable streaming.",
"Your video may not be the best format. Use MP4s in H264/AAC format and a friendly bitrate (720p) for more reliable streaming.": "Your video may not be the best format. Use MP4s in H264/AAC format and a friendly bitrate (720p) for more reliable streaming.",
"Your video has a bitrate over 6 mbps. We suggest transcoding to provide viewers the best experience.": "Your video has a bitrate over 6 mbps. We suggest transcoding to provide viewers the best experience.",
"Your video has a bitrate over 5 mbps. We suggest transcoding to provide viewers the best experience.": "Your video has a bitrate over 5 mbps. We suggest transcoding to provide viewers the best experience."
} }

View file

@ -1,6 +1,6 @@
// @flow // @flow
import * as ICONS from 'constants/icons'; import * as ICONS from 'constants/icons';
import React from 'react'; import React, { useState, useEffect } from 'react';
import { regexInvalidURI } from 'lbry-redux'; import { regexInvalidURI } from 'lbry-redux';
import FileSelector from 'component/common/file-selector'; import FileSelector from 'component/common/file-selector';
import Button from 'component/button'; import Button from 'component/button';
@ -33,6 +33,24 @@ function PublishFile(props: Props) {
clearPublish, clearPublish,
} = props; } = props;
const [duration, setDuration] = useState(0);
const [size, setSize] = useState(0);
const [oversized, setOversized] = useState(false);
const [isVid, setIsVid] = useState(false);
const RECOMMENDED_BITRATE = 6000000;
const TV_PUBLISH_SIZE_LIMIT: number = 1073741824;
const UPLOAD_SIZE_MESSAGE = 'Lbrytv uploads are limited to 1 GB. Download the app for unrestricted publishing.';
// clear warnings
useEffect(() => {
if (!filePath || filePath === '' || filePath.name === '') {
setDuration(0);
setSize(0);
setIsVid(false);
setOversized(false);
}
}, [filePath]);
let currentFile = ''; let currentFile = '';
if (filePath) { if (filePath) {
if (typeof filePath === 'string') { if (typeof filePath === 'string') {
@ -42,19 +60,129 @@ function PublishFile(props: Props) {
} }
} }
function getBitrate(size, duration) {
const s = Number(size);
const d = Number(duration);
if (s && d) {
return (s * 8) / d;
} else {
return 0;
}
}
function getMessage() {
// @if TARGET='web'
if (oversized) {
return (
<p className="help--error">
{__(UPLOAD_SIZE_MESSAGE)}{' '}
<Button button="link" label={__('Publishing Guide')} href="https://lbry.com/faq/video-publishing-guide" />
</p>
);
}
// @endif
if (isVid && duration && getBitrate(size, duration) > RECOMMENDED_BITRATE) {
return (
<p className="help--warning">
{__('Your video has a bitrate over 5 mbps. We suggest transcoding to provide viewers the best experience.')}{' '}
<Button button="link" label={__('Publishing Guide')} href="https://lbry.com/faq/video-publishing-guide" />
</p>
);
}
if (isVid && !duration) {
return (
<p className="help--warning">
{__(
'Your video may not be the best format. Use MP4s in H264/AAC format and a friendly bitrate (720p) for more reliable streaming.'
)}{' '}
<Button button="link" label={__('Publishing Guide')} href="https://lbry.com/faq/video-publishing-guide" />
</p>
);
}
if (!!isStillEditing && name) {
return (
<p className="help">
{__("If you don't choose a file, the file from your existing claim %name% will be used", { name: name })}
</p>
);
}
// @if TARGET='web'
if (!isStillEditing) {
return (
<p className="help">
{__(
'For video content, use MP4s in H264/AAC format and a friendly bitrate (720p) for more reliable streaming. Lbrytv uploads are restricted to 1GB.'
)}{' '}
<Button button="link" label={__('Publishing Guide')} href="https://lbry.com/faq/video-publishing-guide" />
</p>
);
}
// @endif
// @if TARGET='app'
if (!isStillEditing) {
return (
<p className="help">
{__(
'For video content, use MP4s in H264/AAC format and a friendly bitrate (720p) for more reliable streaming.'
)}{' '}
<Button button="link" label={__('Publishing Guide')} href="https://lbry.com/faq/video-publishing-guide" />
</p>
);
}
// @endif
}
function handleFileChange(file: WebFile) { function handleFileChange(file: WebFile) {
const { showToast } = props; const { showToast } = props;
window.URL = window.URL || window.webkitURL;
// if electron, we'll set filePath to the path string because SDK is handling publishing. // if electron, we'll set filePath to the path string because SDK is handling publishing.
// if web, we set the filePath (dumb name) to the File() object // if web, we set the filePath (dumb name) to the File() object
// File.path will be undefined from web due to browser security, so it will default to the File Object. // File.path will be undefined from web due to browser security, so it will default to the File Object.
setSize(file ? file.size : 0);
setDuration(0);
setOversized(false);
// select file, start to select a new one, then cancel
if (!file) {
updatePublishForm({ filePath: '', name: '' });
return;
}
// if video, extract duration so we can warn about bitrate
const contentType = file.type.split('/');
const isVideo = contentType[0] === 'video';
const isMp4 = contentType[1] === 'mp4';
if (isVideo) {
if (isMp4) {
const video = document.createElement('video');
video.preload = 'metadata';
video.onloadedmetadata = function() {
setDuration(video.duration);
setSize(file.size);
setIsVid(isVideo);
window.URL.revokeObjectURL(video.src);
};
video.onerror = function() {
setDuration(0);
setSize(file.size);
setIsVid(isVideo);
};
video.src = window.URL.createObjectURL(file);
} else {
setSize(file.size);
setDuration(0);
setIsVid(isVideo);
}
}
// @if TARGET='web' // @if TARGET='web'
// we only need to enforce file sizes on 'web' // we only need to enforce file sizes on 'web'
const PUBLISH_SIZE_LIMIT: number = 512000000;
if (typeof file !== 'string') { if (typeof file !== 'string') {
if (file && file.size && Number(file.size) > PUBLISH_SIZE_LIMIT) { if (file && file.size && Number(file.size) > TV_PUBLISH_SIZE_LIMIT) {
showToast(__('File uploads currently limited to 500MB. Download the app for unlimited publishing.')); setOversized(true);
showToast(__(UPLOAD_SIZE_MESSAGE));
updatePublishForm({ filePath: '', name: '' }); updatePublishForm({ filePath: '', name: '' });
return; return;
} }
@ -103,19 +231,7 @@ function PublishFile(props: Props) {
actions={ actions={
<React.Fragment> <React.Fragment>
<FileSelector disabled={disabled} currentPath={currentFile} onFileChosen={handleFileChange} /> <FileSelector disabled={disabled} currentPath={currentFile} onFileChosen={handleFileChange} />
{!isStillEditing && ( {getMessage()}
<p className="help">
{__(
'For video content, use MP4s in H264/AAC format and a friendly bitrate (720p) for more reliable streaming.'
)}{' '}
<Button button="link" label={__('Learn more')} href="https://lbry.com/faq/how-to-publish" />.
</p>
)}
{!!isStillEditing && name && (
<p className="help">
{__("If you don't choose a file, the file from your existing claim %name% will be used", { name: name })}
</p>
)}
</React.Fragment> </React.Fragment>
} }
/> />

View file

@ -208,8 +208,8 @@ a {
} }
.help--warning { .help--warning {
background-color: var(--color-warning); @extend .help;
color: var(--color-black); color: var(--color-text-help-warning);
} }
.help--inline { .help--inline {
@ -246,6 +246,11 @@ a {
color: var(--color-text-error); color: var(--color-text-error);
} }
.help--error {
@extend .help;
color: var(--color-text-error);
}
.thumbnail-preview { .thumbnail-preview {
width: var(--thumbnail-preview-width); width: var(--thumbnail-preview-width);
height: var(--thumbnail-preview-height); height: var(--thumbnail-preview-height);

View file

@ -44,6 +44,7 @@
// Text // Text
--color-text: #eeeeee; --color-text: #eeeeee;
--color-text-error: #f5748c; --color-text-error: #f5748c;
--color-text-help-warning: #f5ec74;
--color-text-empty: #bbbbbb; --color-text-empty: #bbbbbb;
--color-text-help: #bbbbbb; --color-text-help: #bbbbbb;
--color-text-subtitle: #9fafc0; --color-text-subtitle: #9fafc0;

View file

@ -24,6 +24,7 @@
--color-text-help: #999999; --color-text-help: #999999;
--color-text-subtitle: #767676; --color-text-subtitle: #767676;
--color-text-warning: #212529; --color-text-warning: #212529;
--color-text-help-warning: #989b20;
--color-text-warning--background: var(--lbry-yellow-1); --color-text-warning--background: var(--lbry-yellow-1);
--color-blockquote: var(--color-gray-3); --color-blockquote: var(--color-gray-3);