[Comments] Batch resolve #7236

Merged
saltrafael merged 17 commits from batch-resolve into master 2021-10-11 03:42:10 +02:00
40 changed files with 1967 additions and 412 deletions

View file

@ -15,7 +15,10 @@ COMMENT_SERVER_API=https://comments.odysee.com/api/v2
COMMENT_SERVER_NAME=Odysee
SEARCH_SERVER_API=https://lighthouse.odysee.com/search
SOCKETY_SERVER_API=wss://sockety.odysee.com/ws
THUMBNAIL_CDN_URL=https://image-processor.vanwanet.com/optimize/
THUMBNAIL_CDN_URL=https://thumbnails.odysee.com/optimize/
THUMBNAIL_HEIGHT=220
THUMBNAIL_WIDTH=390
THUMBNAIL_QUALITY=85
WELCOME_VERSION=1.0
# STRIPE

View file

@ -1,92 +0,0 @@
# Copy this file to .env to make modifications
# Base config
WEBPACK_WEB_PORT=9090
WEBPACK_ELECTRON_PORT=9091
WEB_SERVER_PORT=1337
WELCOME_VERSION=1.0
# Custom Site info
DOMAIN=lbry.tv
URL=https://lbry.tv
# UI
SITE_TITLE=lbry.tv
SITE_NAME=local.lbry.tv
SITE_DESCRIPTION=Meet LBRY, an open, free, and community-controlled content wonderland.
LOGO_TITLE=local.lbry.tv
##### ODYSEE SETTINGS #######
MATOMO_URL=https://analytics.lbry.com/
MATOMO_ID=4
# Base config
WEBPACK_WEB_PORT=9090
WEBPACK_ELECTRON_PORT=9091
WEB_SERVER_PORT=1337
## APIS
LBRY_API_URL=https://api.odysee.com
#LBRY_WEB_API=https://api.na-backend.odysee.com
#LBRY_WEB_STREAMING_API=https://cdn.lbryplayer.xyz
# deprecated:
#LBRY_WEB_BUFFER_API=https://collector-service.api.lbry.tv/api/v1/events/video
#COMMENT_SERVER_API=https://comments.lbry.com/api/v2
WELCOME_VERSION=1.0
# STRIPE
STRIPE_PUBLIC_KEY='pk_live_e8M4dRNnCCbmpZzduEUZBgJO'
## UI
LOADING_BAR_COLOR=#e50054
# IMAGE ASSETS
YRBL_HAPPY_IMG_URL=https://spee.ch/spaceman-happy:a.png
YRBL_SAD_IMG_URL=https://spee.ch/spaceman-sad:d.png
LOGIN_IMG_URL=https://spee.ch/login:b.png
LOGO=https://spee.ch/odysee-logo-png:3.png
LOGO_TEXT_LIGHT=https://spee.ch/odysee-white-png:f.png
LOGO_TEXT_DARK=https://spee.ch/odysee-png:2.png
AVATAR_DEFAULT=https://spee.ch/spaceman-png:2.png
FAVICON=https://spee.ch/favicon-png:c.png
# LOCALE
DEFAULT_LANGUAGE=en
## LINKED CONTENT WHITELIST
KNOWN_APP_DOMAINS=open.lbry.com,lbry.tv,lbry.lat,odysee.com
## CUSTOM CONTENT
# If the following is true, copy custom/homepage.example.js to custom/homepage.js and modify
CUSTOM_HOMEPAGE=true
# Add channels to auto-follow on firstrun (space delimited)
AUTO_FOLLOW_CHANNELS=lbry://@Odysee#80d2590ad04e36fb1d077a9b9e3a8bba76defdf8 lbry://@OdyseeHelp#b58dfaeab6c70754d792cdd9b56ff59b90aea334
## FEATURES AND LIMITS
SIMPLE_SITE=true
BRANDED_SITE=odysee
# SIMPLE_SITE REPLACEMENTS
ENABLE_MATURE=false
ENABLE_UI_NOTIFICATIONS=true
ENABLE_WILD_WEST=true
SHOW_TAGS_INTRO=false
# CENTRALIZED FEATURES
ENABLE_COMMENT_REACTIONS=true
ENABLE_FILE_REACTIONS=true
ENABLE_CREATOR_REACTIONS=true
ENABLE_NO_SOURCE_CLAIMS=true
ENABLE_PREROLL_ADS=false
SHOW_ADS=true
CHANNEL_STAKED_LEVEL_VIDEO_COMMENTS=4
CHANNEL_STAKED_LEVEL_LIVESTREAM=3
WEB_PUBLISH_SIZE_LIMIT_GB=4
#SEARCH TYPES - comma-delimited
LIGHTHOUSE_DEFAULT_TYPES=audio,video

View file

@ -1,100 +0,0 @@
name: Node.js CI
on:
push:
branches: [master]
pull_request:
branches: [master]
jobs:
lint:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: Borales/actions-yarn@v2.3.0
- run: yarn lint
build:
needs: ['lint']
name: 'build'
strategy:
matrix:
node-version: [14.x]
os:
- ubuntu-latest
- macos-latest
- windows-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2-beta
with:
node-version: ${{ matrix.node-version }}
- uses: maxim-lobanov/setup-xcode@v1
if: startsWith(runner.os, 'mac')
with:
xcode-version: '10.3.0'
- name: Download blockchain headers
run: |
mkdir -p ./static/daemon
curl -o ./static/daemon/headers https://headers.lbry.io/blockchain_headers_latest
ls ./static/daemon
- name: Build
run: |
yarn global add cross-env
yarn
yarn build
node ./build/afterSignHook.js
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
NOTARIZATION_USERNAME: ${{ secrets.NOTARIZATION_USERNAME }}
NOTARIZATION_PASSWORD: ${{ secrets.NOTARIZATION_PASSWORD }}
WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
WIN_CSC_LINK: https://s3.amazonaws.com/files.lbry.io/cert/win-csc-2020-2021-08.p12
CSC_LINK: https://s3.amazonaws.com/files.lbry.io/cert/osx-csc-2021-2022.p12
# UI
MATOMO_URL: https://analytics.lbry.com/
MATOMO_ID: 4
WELCOME_VERSION: 1.0
DOMAIN: lbry.tv
URL: https://lbry.tv
SHARE_DOMAIN_URL: https://open.lbry.com
SITE_TITLE: lbry.tv
SITE_NAME: lbry.tv
SHOW_ADS: false
YRBL_HAPPY_IMG_URL: https://cdn.lbryplayer.xyz/api/v3/streams/free/yrbl-happy/7aa50a7e5adaf48691935d55e45d697547392929/839d9a
YRBL_SAD_IMG_URL: https://cdn.lbryplayer.xyz/api/v3/streams/free/yrbl-sad/c2d9649633d974e5ffb503925e1f17d951f1bd0f/f262dd
ENABLE_COMMENT_REACTIONS: true
ENABLE_NO_SOURCE_CLAIMS: false
DEFAULT_LANGUAGE: en
KNOWN_APP_DOMAINS: lbry.tv,lbry.lat,odysee.com
CHANNEL_STAKED_LEVEL_VIDEO_COMMENTS: 0
- uses: actions/upload-artifact@v2
if: |
startsWith(runner.os, 'linux')
with:
name: Linux
path: ./dist/electron/*.*
- uses: actions/upload-artifact@v2
if: |
startsWith(runner.os, 'mac')
with:
name: macOS
path: ./dist/electron/*.*
- uses: actions/upload-artifact@v2
if: |
github.event.pull_request.head.repo.full_name == github.repository
with:
name: Windows
path: ./dist/electron/*.*

59
.github/workflows/node.js.yml vendored Normal file
View file

@ -0,0 +1,59 @@
# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
name: Node.js CI
on:
push:
branches: [master]
pull_request:
branches: [master]
jobs:
lint:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: Borales/actions-yarn@v2.3.0
- run: yarn lint
build:
needs: ['lint']
name: 'build'
strategy:
matrix:
node-version: [14.x]
os:
- ubuntu-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2-beta
with:
node-version: ${{ matrix.node-version }}
- name: Build
run: |
yarn global add cross-env
yarn
yarn compile:web
env:
# UI
MATOMO_URL: https://analytics.lbry.com/
MATOMO_ID: 4
WELCOME_VERSION: 1.0
DOMAIN: odysee.com
URL: https://odysee.com
SHARE_DOMAIN_URL: https://odysee.com
SITE_TITLE: Odysee
SITE_NAME: Odysee
SHOW_ADS: false
YRBL_HAPPY_IMG_URL: https://cdn.lbryplayer.xyz/api/v3/streams/free/yrbl-happy/7aa50a7e5adaf48691935d55e45d697547392929/839d9a
YRBL_SAD_IMG_URL: https://cdn.lbryplayer.xyz/api/v3/streams/free/yrbl-sad/c2d9649633d974e5ffb503925e1f17d951f1bd0f/f262dd
ENABLE_COMMENT_REACTIONS: true
ENABLE_NO_SOURCE_CLAIMS: true
DEFAULT_LANGUAGE: en
KNOWN_APP_DOMAINS: lbry.tv,lbry.lat,odysee.com
CHANNEL_STAKED_LEVEL_VIDEO_COMMENTS: 4

2
.gitignore vendored
View file

@ -33,6 +33,6 @@ package-lock.json
!/custom/robots.disallowall
!/custom/robots.allowall
.env
!.env.ody
.env.ody
.env.desktop
.env.lbrytv

View file

@ -1,11 +1,7 @@
<img width="40%" src="https://miro.medium.com/max/5198/1*bTVuL2THG_0mpwmE-n7Ezg.png" />
# LBRY App - https://lbry.tv
# Odysee Frontend - Odysee.com
This repo contains the UI code that powers the official LBRY desktop app, as well as lbry.tv. The LBRY app is a graphical browser for the decentralized content marketplace provided by the
[LBRY](https://lbry.com) protocol. It is essentially the
[lbry daemon](https://github.com/lbryio/lbry) bundled with a UI using
[Electron](https://electron.atom.io/).
This repo contains the UI and front end code that powers Odysee.com.
<a href="https://github.com/lbryio/lbry-desktop/blob/master/LICENSE" title="MIT licensed">
<img alt="npm" src="https://img.shields.io/dub/l/vibe-d.svg?style=flat">
@ -29,7 +25,6 @@ This repo contains the UI code that powers the official LBRY desktop app, as wel
</a>
</h2>
![App GIF](https://spee.ch/ba/lbry-joule.gif)
## Table of Contents
@ -170,9 +165,6 @@ This project is MIT licensed. For the full license, see [LICENSE](LICENSE).
## Security
We take security seriously. Please contact security@lbry.com regarding any security issues. Our PGP key is [here](https://lbry.com/faq/pgp-key) if you need it. Previous versions up to v0.50.2 were signed by [Sean Yesmunt](https://keybase.io/seanyesmunt/key.asc).
We take security seriously. Please contact security@odysee.com regarding any security issues. Our PGP key is [here](https://lbry.com/faq/pgp-key) if you need it. Previous versions up to v0.50.2 were signed by [Sean Yesmunt](https://keybase.io/seanyesmunt/key.asc).
New Releases are signed by [Jessop Breth](https://keybase.io/jessopb/key.asc).
## Contact
The primary contact for this project is [@jessopb](https://github.com/jessopb).

View file

@ -22,6 +22,9 @@ const config = {
SHARE_DOMAIN_URL: process.env.SHARE_DOMAIN_URL,
URL: process.env.URL,
THUMBNAIL_CDN_URL: process.env.THUMBNAIL_CDN_URL,
THUMBNAIL_HEIGHT: process.env.THUMBNAIL_HEIGHT,
THUMBNAIL_WIDTH: process.env.THUMBNAIL_WIDTH,
THUMBNAIL_QUALITY: process.env.THUMBNAIL_QUALITY,
SITE_TITLE: process.env.SITE_TITLE,
SITE_NAME: process.env.SITE_NAME,
SITE_DESCRIPTION: process.env.SITE_DESCRIPTION,

View file

@ -157,7 +157,7 @@
"imagesloaded": "^4.1.4",
"json-loader": "^0.5.4",
"lbry-format": "https://github.com/lbryio/lbry-format.git",
"lbry-redux": "lbryio/lbry-redux#32b578707116d45f5b51b7ab523d200e75668676",
"lbry-redux": "lbryio/lbry-redux#0f930c4a7bfc7f164e6b3c6044050c1bc73f6ab8",
"lbryinc": "lbryio/lbryinc#0b4e41ef90d6347819dd3453f2f9398a5c1b4f36",
"lint-staged": "^7.0.2",
"localforage": "^1.7.1",

View file

@ -450,7 +450,7 @@ function ClaimListDiscover(props: Props) {
<p>
<I18nMessage
tokens={{
contact_support: <Button button="link" label={__('contact support')} href="https://lbry.com/faq/support" />,
contact_support: <Button button="link" label={__('contact support')} href="https://odysee.com/@OdyseeHelp:b?view=about" />,
}}
>
If you continue to have issues, please %contact_support%.

View file

@ -117,12 +117,18 @@ function Comment(props: Props) {
location: { pathname, search },
} = useHistory();
const isInLinkedCommentChain =
linkedCommentId &&
linkedCommentAncestors[linkedCommentId] &&
linkedCommentAncestors[linkedCommentId].includes(commentId);
const showRepliesOnMount = isInLinkedCommentChain || AUTO_EXPAND_ALL_REPLIES;
const [isReplying, setReplying] = React.useState(false);
const [isEditing, setEditing] = useState(false);
const [editedMessage, setCommentValue] = useState(message);
const [charCount, setCharCount] = useState(editedMessage.length);
const [showReplies, setShowReplies] = useState(false);
const [page, setPage] = useState(0);
const [showReplies, setShowReplies] = useState(showRepliesOnMount);
const [page, setPage] = useState(showRepliesOnMount ? 1 : 0);
const [advancedEditor] = usePersistedState('comment-editor-mode', false);
const [displayDeadComment, setDisplayDeadComment] = React.useState(false);
const hasChannels = myChannels && myChannels.length > 0;
@ -140,19 +146,6 @@ function Comment(props: Props) {
}
} catch (e) {}
// Auto-expand (limited to linked-comments for now, but can be for all)
useEffect(() => {
const isInLinkedCommentChain =
linkedCommentId &&
linkedCommentAncestors[linkedCommentId] &&
linkedCommentAncestors[linkedCommentId].includes(commentId);
if (isInLinkedCommentChain || AUTO_EXPAND_ALL_REPLIES) {
setShowReplies(true);
setPage(1);
}
}, []); // eslint-disable-line react-hooks/exhaustive-deps
useEffect(() => {
if (isEditing) {
setCharCount(editedMessage.length);

View file

@ -1,5 +1,6 @@
import { connect } from 'react-redux';
import {
doResolveUris,
makeSelectClaimForUri,
makeSelectClaimIsMine,
selectFetchingMyChannels,
@ -24,11 +25,21 @@ import CommentsList from './view';
const select = (state, props) => {
const activeChannelClaim = selectActiveChannelClaim(state);
const topLevelComments = makeSelectTopLevelCommentsForUri(props.uri)(state);
const resolvedComments = [];
if (topLevelComments.length > 0) {
topLevelComments.map(
(comment) => Boolean(makeSelectClaimForUri(comment.channel_url)(state)) && resolvedComments.push(comment)
);
}
return {
topLevelComments,
resolvedComments,
myChannels: selectMyChannelClaims(state),
infinite-persistence commented 2021-10-11 03:29:11 +02:00 (Migrated from github.com)
Review

resolveComments = topLevelComments.filter() might be a clearer choice to convey the intention, but that's minor.

`resolveComments = topLevelComments.filter()` might be a clearer choice to convey the intention, but that's minor.
allCommentIds: makeSelectCommentIdsForUri(props.uri)(state),
pinnedComments: makeSelectPinnedCommentsForUri(props.uri)(state),
topLevelComments: makeSelectTopLevelCommentsForUri(props.uri)(state),
topLevelTotalPages: makeSelectTopLevelTotalPagesForUri(props.uri)(state),
totalComments: makeSelectTotalCommentsCountForUri(props.uri)(state),
claim: makeSelectClaimForUri(props.uri)(state),
@ -49,6 +60,7 @@ const perform = (dispatch) => ({
fetchComment: (commentId) => dispatch(doCommentById(commentId)),
fetchReacts: (commentIds) => dispatch(doCommentReactList(commentIds)),
resetComments: (claimId) => dispatch(doCommentReset(claimId)),
doResolveUris: (uris) => dispatch(doResolveUris(uris, true)),
});
export default connect(select, perform)(CommentsList);

View file

@ -32,6 +32,7 @@ type Props = {
allCommentIds: any,
pinnedComments: Array<Comment>,
topLevelComments: Array<Comment>,
resolvedComments: Array<Comment>,
topLevelTotalPages: number,
uri: string,
claim: ?Claim,
@ -47,8 +48,9 @@ type Props = {
othersReactsById: ?{ [string]: { [REACTION_TYPES.LIKE | REACTION_TYPES.DISLIKE]: number } },
activeChannelId: ?string,
settingsByChannelId: { [channelId: string]: PerChannelSettings },
fetchReacts: (Array<string>) => Promise<any>,
commentsAreExpanded?: boolean,
fetchReacts: (Array<string>) => Promise<any>,
doResolveUris: (Array<string>) => void,
fetchTopLevelComments: (string, number, number, number) => void,
fetchComment: (string) => void,
resetComments: (string) => void,
@ -60,6 +62,7 @@ function CommentList(props: Props) {
uri,
pinnedComments,
topLevelComments,
resolvedComments,
topLevelTotalPages,
claim,
claimIsMine,
@ -74,8 +77,9 @@ function CommentList(props: Props) {
othersReactsById,
activeChannelId,
settingsByChannelId,
fetchReacts,
commentsAreExpanded,
fetchReacts,
doResolveUris,
fetchTopLevelComments,
fetchComment,
resetComments,
@ -221,8 +225,16 @@ function CommentList(props: Props) {
}
}, [hasDefaultExpansion, isFetchingComments, moreBelow, page, readyToDisplayComments, topLevelTotalPages]);
const getCommentElems = (comments) => {
return comments.map((comment) => (
// Batch resolve comment channel urls
useEffect(() => {
const urisToResolve = [];
topLevelComments.map(({ channel_url }) => channel_url !== undefined && urisToResolve.push(channel_url));
if (urisToResolve.length > 0) doResolveUris(urisToResolve);
}, [topLevelComments, doResolveUris]);
const getCommentElems = (comments) =>
comments.map((comment) => (
<CommentView
isTopLevel
threadDepth={3}
@ -247,22 +259,19 @@ function CommentList(props: Props) {
isFiat={comment.is_fiat}
/>
));
};
const sortButton = (label, icon, sortOption) => {
return (
<Button
button="alt"
label={label}
icon={icon}
iconSize={18}
onClick={() => changeSort(sortOption)}
className={classnames(`button-toggle`, {
'button-toggle--active': sort === sortOption,
})}
/>
);
};
const sortButton = (label, icon, sortOption) => (
<Button
button="alt"
label={label}
icon={icon}
iconSize={18}
onClick={() => changeSort(sortOption)}
className={classnames(`button-toggle`, {
'button-toggle--active': sort === sortOption,
})}
/>
);
return (
<Card
@ -299,7 +308,7 @@ function CommentList(props: Props) {
})}
>
{readyToDisplayComments && pinnedComments && getCommentElems(pinnedComments)}
{readyToDisplayComments && topLevelComments && getCommentElems(topLevelComments)}
{readyToDisplayComments && resolvedComments && getCommentElems(resolvedComments)}
</ul>
{!hasDefaultExpansion && (

View file

@ -1,15 +1,29 @@
import { connect } from 'react-redux';
import { makeSelectClaimIsMine, selectMyChannelClaims } from 'lbry-redux';
import { makeSelectClaimIsMine, selectMyChannelClaims, makeSelectClaimForUri, doResolveUris } from 'lbry-redux';
import { selectIsFetchingCommentsByParentId, makeSelectRepliesForParentId } from 'redux/selectors/comments';
import { selectUserVerifiedEmail } from 'redux/selectors/user';
import CommentsReplies from './view';
const select = (state, props) => ({
fetchedReplies: makeSelectRepliesForParentId(props.parentId)(state),
claimIsMine: makeSelectClaimIsMine(props.uri)(state),
commentingEnabled: IS_WEB ? Boolean(selectUserVerifiedEmail(state)) : true,
myChannels: selectMyChannelClaims(state),
isFetchingByParentId: selectIsFetchingCommentsByParentId(state),
});
const select = (state, props) => {
const fetchedReplies = makeSelectRepliesForParentId(props.parentId)(state);
const resolvedReplies = [];
export default connect(select)(CommentsReplies);
if (fetchedReplies && fetchedReplies.length > 0) {
fetchedReplies.map(
(comment) => Boolean(makeSelectClaimForUri(comment.channel_url)(state)) && resolvedReplies.push(comment)
);
}
return {
fetchedReplies,
resolvedReplies,
claimIsMine: makeSelectClaimIsMine(props.uri)(state),
userCanComment: IS_WEB ? Boolean(selectUserVerifiedEmail(state)) : true,
myChannels: selectMyChannelClaims(state),
isFetchingByParentId: selectIsFetchingCommentsByParentId(state),
};
};
const perform = (dispatch) => ({ doResolveUris: (uris) => dispatch(doResolveUris(uris, true)) });
export default connect(select, perform)(CommentsReplies);

View file

@ -1,24 +1,26 @@
// @flow
import * as ICONS from 'constants/icons';
import React from 'react';
import Comment from 'component/comment';
import Button from 'component/button';
import Comment from 'component/comment';
import React from 'react';
import Spinner from 'component/spinner';
type Props = {
fetchedReplies: Array<any>,
fetchedReplies: Array<Comment>,
resolvedReplies: Array<Comment>,
uri: string,
parentId: string,
claimIsMine: boolean,
myChannels: ?Array<ChannelClaim>,
linkedCommentId?: string,
commentingEnabled: boolean,
userCanComment: boolean,
threadDepth: number,
numDirectReplies: number, // Total replies for parentId as reported by 'comment[replies]'. Includes blocked items.
isFetchingByParentId: { [string]: boolean },
onShowMore?: () => void,
hasMore: boolean,
supportDisabled: boolean,
doResolveUris: (Array<string>) => void,
onShowMore?: () => void,
};
function CommentsReplies(props: Props) {
@ -26,102 +28,98 @@ function CommentsReplies(props: Props) {
uri,
parentId,
fetchedReplies,
resolvedReplies,
claimIsMine,
myChannels,
linkedCommentId,
commentingEnabled,
userCanComment,
threadDepth,
numDirectReplies,
isFetchingByParentId,
onShowMore,
hasMore,
supportDisabled,
doResolveUris,
onShowMore,
} = props;
const [isExpanded, setExpanded] = React.useState(true);
const isResolvingReplies = fetchedReplies && resolvedReplies.length !== fetchedReplies.length;
function showMore() {
if (onShowMore) {
onShowMore();
}
}
// Batch resolve comment channel urls
React.useEffect(() => {
if (!fetchedReplies) return;
// todo: implement comment_list --mine in SDK so redux can grab with selectCommentIsMine
function isMyComment(channelId: string) {
if (myChannels != null && channelId != null) {
for (let i = 0; i < myChannels.length; i++) {
if (myChannels[i].claim_id === channelId) {
return true;
}
}
}
return false;
}
const urisToResolve = [];
fetchedReplies.map(({ channel_url }) => channel_url !== undefined && urisToResolve.push(channel_url));
const displayedComments = fetchedReplies;
if (urisToResolve.length > 0) doResolveUris(urisToResolve);
}, [fetchedReplies, doResolveUris]);
return (
Boolean(numDirectReplies) && (
<div className="comment__replies-container">
{Boolean(numDirectReplies) && !isExpanded && (
return !numDirectReplies ? null : (
<div className="comment__replies-container">
{!isExpanded ? (
<div className="comment__actions--nested">
<Button
className="comment__action"
label={__('Show Replies')}
onClick={() => setExpanded(!isExpanded)}
icon={isExpanded ? ICONS.UP : ICONS.DOWN}
/>
</div>
) : (
<div className="comment__replies">
<Button className="comment__threadline" aria-label="Hide Replies" onClick={() => setExpanded(false)} />
<ul className="comments--replies">
{!isResolvingReplies &&
resolvedReplies.length > 0 &&
resolvedReplies.map((comment) => (
<Comment
threadDepth={threadDepth}
uri={uri}
authorUri={comment.channel_url}
author={comment.channel_name}
claimId={comment.claim_id}
commentId={comment.comment_id}
key={comment.comment_id}
message={comment.comment}
timePosted={comment.timestamp * 1000}
claimIsMine={claimIsMine}
commentIsMine={
comment.channel_id &&
myChannels &&
myChannels.some(({ claim_id }) => claim_id === comment.channel_id)
}
linkedCommentId={linkedCommentId}
commentingEnabled={userCanComment}
supportAmount={comment.support_amount}
numDirectReplies={comment.replies}
isModerator={comment.is_moderator}
isGlobalMod={comment.is_global_mod}
supportDisabled={supportDisabled}
/>
))}
</ul>
</div>
)}
{isExpanded && fetchedReplies && hasMore && (
<div className="comment__actions--nested">
<Button
button="link"
label={__('Show more')}
onClick={() => onShowMore && onShowMore()}
className="button--uri-indicator"
/>
</div>
)}
{(isFetchingByParentId[parentId] || isResolvingReplies) && (
<div className="comment__replies-container">
<div className="comment__actions--nested">
<Button
className="comment__action"
label={__('Show Replies')}
onClick={() => setExpanded(!isExpanded)}
icon={isExpanded ? ICONS.UP : ICONS.DOWN}
/>
<Spinner type="small" />
</div>
)}
{isExpanded && (
<div>
<div className="comment__replies">
<Button className="comment__threadline" aria-label="Hide Replies" onClick={() => setExpanded(false)} />
<ul className="comments--replies">
{displayedComments &&
displayedComments.map((comment) => {
return (
<Comment
threadDepth={threadDepth}
uri={uri}
authorUri={comment.channel_url}
author={comment.channel_name}
claimId={comment.claim_id}
commentId={comment.comment_id}
key={comment.comment_id}
message={comment.comment}
timePosted={comment.timestamp * 1000}
claimIsMine={claimIsMine}
commentIsMine={comment.channel_id && isMyComment(comment.channel_id)}
linkedCommentId={linkedCommentId}
commentingEnabled={commentingEnabled}
supportAmount={comment.support_amount}
numDirectReplies={comment.replies}
isModerator={comment.is_moderator}
isGlobalMod={comment.is_global_mod}
supportDisabled={supportDisabled}
/>
);
})}
</ul>
</div>
</div>
)}
{isExpanded && fetchedReplies && hasMore && (
<div className="comment__actions--nested">
<Button button="link" label={__('Show more')} onClick={showMore} className="button--uri-indicator" />
</div>
)}
{isFetchingByParentId[parentId] && (
<div className="comment__replies-container">
<div className="comment__actions--nested">
<Spinner type="small" />
</div>
</div>
)}
</div>
)
</div>
)}
</div>
);
}

View file

@ -42,6 +42,7 @@ type MarkdownProps = {
className?: string,
parentCommentId?: string,
isMarkdownPost?: boolean,
disableTimestamps?: boolean,
stakedLevel?: number,
};
@ -132,7 +133,17 @@ function isStakeEnoughForPreview(stakedLevel) {
// ****************************************************************************
const MarkdownPreview = (props: MarkdownProps) => {
const { content, strip, simpleLinks, noDataStore, className, parentCommentId, isMarkdownPost, stakedLevel } = props;
const {
content,
strip,
simpleLinks,
noDataStore,
className,
parentCommentId,
isMarkdownPost,
disableTimestamps,
stakedLevel,
} = props;
const strippedContent = content
? content.replace(REPLACE_REGEX, (iframeHtml, y, iframeSrc) => {
// Let the browser try to create an iframe to see if the markup is valid
@ -217,8 +228,8 @@ const MarkdownPreview = (props: MarkdownProps) => {
// Note: The order is important
.use(formatedLinks)
.use(inlineLinks)
.use(isMarkdownPost ? null : inlineTimestamp)
.use(isMarkdownPost ? null : formattedTimestamp)
.use(disableTimestamps || isMarkdownPost ? null : inlineTimestamp)
.use(disableTimestamps || isMarkdownPost ? null : formattedTimestamp)
// Emojis
.use(remarkEmoji)
// Render new lines without needing spaces.

View file

@ -12,7 +12,6 @@ import Icon from 'component/common/icon';
import I18nMessage from 'component/i18nMessage';
import Button from 'component/button';
import FileDescription from 'component/fileDescription';
import usePersistedState from 'effects/use-persisted-state';
import { ENABLE_MATURE } from 'config';
type Props = {
@ -41,7 +40,6 @@ function FileTitleSection(props: Props) {
channelClaimId,
fetchSubCount,
} = props;
const [hasAcknowledgedSec, setHasAcknowledgedSec] = usePersistedState('sec-nag', false);
React.useEffect(() => {
if (channelClaimId) {
@ -51,16 +49,6 @@ function FileTitleSection(props: Props) {
return (
<>
{!hasAcknowledgedSec && (
<div className="notice-message">
<Button button="close" icon={ICONS.REMOVE} onClick={() => setHasAcknowledgedSec(true)} />
<h1 className="section__title">{__('Help LBRY Save Crypto')}</h1>
<p className="section__subtitle">
{__('The US government is attempting to destroy the cryptocurrency industry. Can you help?')}{' '}
<Button label={__('Learn more and sign petition')} button="link" href="https://helplbrysavecrypto.com" />
</p>
</div>
)}
<Card
isPageTitle
noTitleWrap

View file

@ -104,7 +104,7 @@ function LivestreamComment(props: Props) {
)}
<div className="livestream-comment__text">
<MarkdownPreview content={message} promptLinks stakedLevel={stakedLevel} />
<MarkdownPreview content={message} promptLinks stakedLevel={stakedLevel} disableTimestamps />
</div>
</div>
</div>

View file

@ -14,11 +14,11 @@ const LIMITED = 'limited';
const NONE = 'none';
type Props = {
setWelcomeVersion: number => void,
setWelcomeVersion: (number) => void,
signOut: () => void,
setShareDataInternal: boolean => void,
setShareDataThirdParty: boolean => void,
history: { replace: string => void },
setShareDataInternal: (boolean) => void,
setShareDataThirdParty: (boolean) => void,
history: { replace: (string) => void },
authenticated: boolean,
authenticateIfSharingData: () => void,
};
@ -88,7 +88,7 @@ function PrivacyAgreement(props: Props) {
helper={__(`Sending information to third parties (e.g. Google Analytics or Mixpanel) allows us to use detailed
analytical reports to improve all aspects of LBRY.`)}
checked={share === FREE}
onChange={e => setShare(FREE)}
onChange={(e) => setShare(FREE)}
/>
<FormField
name={'shareWithLBRY'}
@ -103,7 +103,7 @@ function PrivacyAgreement(props: Props) {
`Sharing information with LBRY, Inc. allows us to report to publishers how their content is doing, as
well as track basic usage and performance. This is the minimum required to earn rewards from LBRY, Inc.`
)}
onChange={e => setShare(LIMITED)}
onChange={(e) => setShare(LIMITED)}
/>
<FormField
disabled={authenticated}
@ -118,7 +118,7 @@ function PrivacyAgreement(props: Props) {
helper={__(`No information will be sent directly to LBRY, Inc. or third-parties about your usage. Note that as
peer-to-peer software, your IP address and potentially other system information can be sent to other
users, though this information is not stored permanently.`)}
onChange={e => setShare(NONE)}
onChange={(e) => setShare(NONE)}
/>
{authenticated && (
<div className="card--inline section--padded">
@ -139,9 +139,7 @@ function PrivacyAgreement(props: Props) {
<p className="section__subtitle">
<I18nMessage
tokens={{
terms: (
<Button button="link" href="https://www.lbry.com/termsofservice" label={__('Terms of Service')} />
),
terms: <Button button="link" href="https://odysee.com/$/tos" label={__('Terms of Service')} />,
}}
>
Do you agree to the %terms%?
@ -153,14 +151,14 @@ function PrivacyAgreement(props: Props) {
type="radio"
label={'Yes'}
checked={agree === true}
onChange={e => setAgree(e.target.checked)}
onChange={(e) => setAgree(e.target.checked)}
/>
<FormField
name={'disagreeButton'}
type="radio"
checked={agree === false}
label={__('No')}
onChange={e => setAgree(!e.target.checked)}
onChange={(e) => setAgree(!e.target.checked)}
/>
</fieldset>
</div>

View file

@ -667,7 +667,7 @@ function PublishForm(props: Props) {
lbry_terms_of_service: (
<Button
button="link"
href="https://www.lbry.com/termsofservice"
href="https://odysee.com/$/tos"
label={__('%site_name% Terms of Service', { site_name: SITE_NAME })}
/>
),

View file

@ -19,6 +19,9 @@ const BackupPage = lazyImport(() => import('page/backup' /* webpackChunkName: "b
// @if TARGET='web'
const Code2257Page = lazyImport(() => import('web/page/code2257' /* webpackChunkName: "code2257" */));
const PrivacyPolicyPage = lazyImport(() => import('web/page/privacypolicy' /* webpackChunkName: "privacypolicy" */));
const TOSPage = lazyImport(() => import('web/page/tos' /* webpackChunkName: "tos" */));
const YouTubeTOSPage = lazyImport(() => import('web/page/youtubetos' /* webpackChunkName: "youtubetos" */));
// @endif
// Chunk: "secondary"
@ -278,6 +281,9 @@ function AppRouter(props: Props) {
{/* @endif */}
{/* @if TARGET='web' */}
<Route path={`/$/${PAGES.CODE_2257}`} exact component={Code2257Page} />
<Route path={`/$/${PAGES.PRIVACY_POLICY}`} exact component={PrivacyPolicyPage} />
<Route path={`/$/${PAGES.TOS}`} exact component={TOSPage} />
<Route path={`/$/${PAGES.YOUTUBE_TOS}`} exact component={YouTubeTOSPage} />
{/* @endif */}
<Route path={`/$/${PAGES.AUTH_VERIFY}`} exact component={SignInVerifyPage} />
<Route path={`/$/${PAGES.SEARCH}`} exact component={SearchPage} />

View file

@ -182,7 +182,7 @@ export default function SettingSystem(props: Props) {
{__(
`This is information like error logging, performance tracking, and usage statistics. It includes your IP address and basic system details, but no other identifying information (unless you sign in to lbry.tv)`
)}{' '}
<Button button="link" label={__('Learn more')} href="https://lbry.com/privacypolicy" />
<Button button="link" label={__('Learn more')} href="https://odysee.com/$/privacypolicy" />
</React.Fragment>
}
multirow

View file

@ -299,10 +299,7 @@ function SideNavigation(props: Props) {
const helpLinks = (
<ul className="navigation__tertiary navigation-links--small">
<li className="navigation-link">
<Button label={__('About --[link title in Sidebar or Footer]--')} href="https://lbry.com/about" />
</li>
<li className="navigation-link">
<Button label={__('FAQ')} href="https://odysee.com/@OdyseeHelp:b" />
<Button label={__('FAQ and Support')} href="https://odysee.com/@OdyseeHelp:b" />
</li>
{SIMPLE_SITE && ( // GUIDELINES_URL?
<li className="navigation-link">
@ -310,13 +307,10 @@ function SideNavigation(props: Props) {
</li>
)}
<li className="navigation-link">
<Button label={__('Support --[used in footer; general help/support]--')} href="https://lbry.com/support" />
<Button label={__('Terms')} href="https://odysee.com/$/tos" />
</li>
<li className="navigation-link">
<Button label={__('Terms')} href="https://lbry.com/termsofservice" />
</li>
<li className="navigation-link">
<Button label={__('Privacy Policy')} href="https://lbry.com/privacy" />
<Button label={__('Privacy Policy')} href="https://odysee.com/$/privacypolicy" />
</li>
</ul>
);

View file

@ -177,7 +177,7 @@ function UserEmailNew(props: Props) {
<p className="help--card-actions">
<I18nMessage
tokens={{
terms: <Button button="link" href="https://www.lbry.com/termsofservice" label={__('terms')} />,
terms: <Button button="link" href="https://odysee.com/$/tos" label={__('terms')} />,
}}
>
By creating an account, you agree to our %terms% and confirm you're over the age of 13.

View file

@ -30,6 +30,9 @@ export const PAGE_TITLE = {
[PAGES.CHANNEL_NEW]: 'Create a channel',
[PAGES.CHECKOUT]: 'Checkout',
[PAGES.CODE_2257]: '2257',
[PAGES.PRIVACY_POLICY]: 'Privacy Policy',
[PAGES.TOS]: 'Terms of Service',
[PAGES.YOUTUBE_TOS]: 'YouTube Sync Terms of Service',
[PAGES.CREATOR_DASHBOARD]: 'Creator Analytics',
[PAGES.HELP]: 'Help',
[PAGES.INVITE]: 'Invite',

View file

@ -66,6 +66,9 @@ exports.WELCOME = 'welcome';
exports.CREATOR_DASHBOARD = 'dashboard';
exports.CHECKOUT = 'checkout';
exports.CODE_2257 = '2257';
exports.PRIVACY_POLICY = 'privacypolicy';
exports.TOS = 'tos';
exports.YOUTUBE_TOS = 'youtubetos';
exports.BUY = 'buy';
exports.RECEIVE = 'receive';
exports.SEND = 'send';

View file

@ -200,7 +200,9 @@ class HelpPage extends React.PureComponent<Props, State> {
subtitle={
<I18nMessage
tokens={{
support_link: <Button button="link" label={__('support')} href="https://lbry.com/faq/support" />,
support_link: (
<Button button="link" label={__('support')} href="https://odysee.com/@OdyseeHelp:b?view=about" />
),
}}
>
Did something go wrong? Have a look in your log file, or send it to %support_link%.

View file

@ -76,7 +76,7 @@ class RewardsPage extends PureComponent<Props> {
<p>
<I18nMessage
tokens={{
rewards_faq: <Button button="link" label={__('Rewards FAQ')} href="https://lbry.com/faq/support" />,
rewards_faq: <Button button="link" label={__('Rewards FAQ')} href="https://odysee.com/@OdyseeHelp:b?view=about" />,
help_email: SITE_HELP_EMAIL,
site_name: SITE_NAME,
}}

View file

@ -162,7 +162,7 @@ export default function YoutubeSync(props: Props) {
<I18nMessage
tokens={{
terms: (
<Button button="link" label={__('these terms')} href="https://lbry.com/faq/youtube-terms" />
<Button button="link" label={__('these terms')} href="https://odysee.com/$/youtubetos" />
),
faq: (
<Button

View file

@ -1,9 +1,5 @@
// @flow
import { THUMBNAIL_CDN_URL } from 'config';
const THUMBNAIL_HEIGHT = 220;
const THUMBNAIL_WIDTH = 390;
const THUMBNAIL_QUALITY = 85;
import { THUMBNAIL_CDN_URL, THUMBNAIL_HEIGHT, THUMBNAIL_WIDTH, THUMBNAIL_QUALITY } from 'config';
type Props = {
thumbnail: ?string,
@ -23,7 +19,11 @@ export function getThumbnailCdnUrl(props: Props) {
return `${THUMBNAIL_CDN_URL}s:${width}:${height}/quality:${quality}/plain/${thumbnail}`;
}
if (thumbnail && thumbnail.includes('https://spee.ch')) {
if (thumbnail && thumbnail.includes('https://spee.ch') && !thumbnail.includes('?quality=')) {
return `${thumbnail}?quality=${quality}&height=${height}&width=${width}`;
}
if (thumbnail && thumbnail.includes('https://spee.ch')) {
return thumbnail;
}
}

View file

@ -1,6 +1,5 @@
import React from 'react';
import Button from 'component/button';
import I18nMessage from 'component/i18nMessage';
import { SIMPLE_SITE } from 'config';
export default function Footer() {
@ -9,15 +8,7 @@ export default function Footer() {
}
return (
<footer className="footer">
<span className="footer__section-title">
<I18nMessage tokens={{ lbry_link: <Button button="link" label={'LBRY'} href="https://lbry.com" /> }}>
POWERED BY %lbry_link%
</I18nMessage>
</span>
<ul className="navigation__tertiary footer__links">
<li className="footer__link">
<Button label={__('About --[link title in Sidebar or Footer]--')} href="https://lbry.com/about" />
</li>
<li className="footer__link">
<Button label={__('Community Guidelines')} href="https://odysee.com/@OdyseeHelp:b/Community-Guidelines:c" />
</li>
@ -25,13 +16,16 @@ export default function Footer() {
<Button label={__('FAQ')} href="https://odysee.com/@OdyseeHelp:b" />
</li>
<li className="footer__link">
<Button label={__('Support --[used in footer; general help/support]--')} href="https://lbry.com/support" />
<Button
label={__('Support --[used in footer; general help/support]--')}
href="https://odysee.com/@OdyseeHelp:b"
/>
</li>
<li className="footer__link">
<Button label={__('Terms')} href="https://lbry.com/termsofservice" />
<Button label={__('Terms')} href="https://odysee.com/$/tos" />
</li>
<li className="footer__link">
<Button label={__('Privacy Policy')} href="https://lbry.com/privacy" />
<Button label={__('Privacy Policy')} href="https://odysee.com/$/privacypolicy" />
</li>
</ul>
</footer>

View file

@ -24,7 +24,7 @@ export default function NagDegradedPerformance(props: Props) {
<Button
button="link"
label={__('more --[value for "more_information"]--')}
href="https://lbry.com/faq/privacy-and-data"
href="https://odysee.com/$/privacypolicy"
/>
),
}}
@ -44,7 +44,7 @@ export default function NagDegradedPerformance(props: Props) {
<Button
button="link"
label={__('more --[value for "more_information"]--')}
href="https://lbry.com/faq/privacy-and-data"
href="https://odysee.com/$/privacypolicy"
/>
),
}}

View file

@ -7,21 +7,21 @@ const Code2257Page = () => {
return (
<Page>
<Card
title="18 USC 2257 Statement: lbry.tv"
title="18 USC 2257 Statement: odysee.com"
body={
<div>
<p>
lbry.tv is not a producer (primary or secondary) of any and all of the content found on the website
(lbry.tv). With respect to the records as per 18 USC 2257 for any and all content found on this site,
odysee.com is not a producer (primary or secondary) of any and all of the content found on the website
(odysee.com). With respect to the records as per 18 USC 2257 for any and all content found on this site,
please kindly direct your request to the site for which the content was produced.
</p>
<p>
lbry.tv is a video sharing site in which allows for the uploading, sharing and general viewing of various
types of adult content and while lbry.tv does the best it can with verifying compliance, it may not be
100% accurate.
odysee.com is a video sharing site in which allows for the uploading, sharing and general viewing of
various types of adult content and while odysee.com does the best it can with verifying compliance, it may
not be 100% accurate.
</p>
<p>
lbry.tv abides by the following procedures to ensure compliance:
odysee.com abides by the following procedures to ensure compliance:
<ul>
<li>Requiring all users to be 18 years of age to upload videos.</li>
<li>
@ -32,10 +32,10 @@ const Code2257Page = () => {
</p>
<p>
For further assistance and/or information in finding the content's originating site, please contact
lbry.tv compliance at copyright@lbry.com
odysee.com compliance at hello@odysee.com
</p>
<p>
Users of lbry.tv who come across such content are urged to flag it as inappropriate by clicking 'Report
Users of odysee.com who come across such content are urged to flag it as inappropriate by clicking 'Report
this video' link found below each video.
</p>
</div>

View file

@ -0,0 +1,2 @@
import PagePrivacyPolicy from './view';
export default PagePrivacyPolicy;

View file

@ -0,0 +1,394 @@
// @flow
import React from 'react';
import Page from 'component/page';
import Card from 'component/common/card';
const PrivacyPolicyPage = () => {
return (
<Page>
<Card
title="Privacy Policy"
body={
<div>
<p>
This privacy policy has been compiled to better serve those who are concerned with how their 'Personally
Identifiable Information' (PII) is being used online. PII, as described in US privacy law and information
security, is information that can be used on its own or with other information to identify, contact, or
locate a single person, or to identify an individual in context. Please read our privacy policy carefully
to get a clear understanding of how we collect, use, protect or otherwise handle your Personally
Identifiable Information in accordance with our website.
</p>
<p>
<strong>
What personal information do we collect from the people that visit our blog, website or app?
</strong>
</p>
<p>
When ordering or registering on our site, as appropriate, you may be asked to enter your name, email
address, mailing address, phone number, credit card information or other details to help you with your
experience.
</p>
<p>
<strong>When do we collect information?</strong>
</p>
<p>
We collect information from you when you register on our site, place an order, subscribe to a newsletter,
respond to a survey, fill out a form, open a support ticket or enter information on our site, or provide
us with feedback on our products or services.
</p>
<p>
<strong>How do we use your information? </strong>
</p>
<p>
We may use the information we collect from you when you register, make a purchase, sign up for our
newsletter, respond to a survey or marketing communication, surf the website, or use certain other site
features in the following ways:
</p>
<ul>
<li>
To personalize your experience and to allow us to deliver the type of content and product offerings in
which you are most interested.
</li>
<li>To improve our website in order to better serve you.</li>
<li>To allow us to better service you in responding to your customer service requests.</li>
<li>To administer a contest, promotion, survey or other site feature.</li>
<li>To quickly process your transactions.</li>
<li>To send periodic emails regarding your order or other products and services.</li>
<li>To follow up with them after correspondence (live chat, email or phone inquiries)</li>
</ul>
<p>
<strong>How do we protect your information?</strong>
</p>
<p>
Our website is scanned on a regular basis for security holes and known vulnerabilities in order to make
your visit to our site as safe as possible.
</p>
<p>We use regular Malware Scanning.</p>
<p>
Your personal information is contained behind secured networks and is only accessible by a limited number
of persons who have special access rights to such systems, and are required to keep the information
confidential. In addition, all sensitive/credit information you supply is encrypted via Secure Socket
Layer (SSL) technology.
</p>
<p>
We implement a variety of security measures when a user places an order enters, submits, or accesses their
information to maintain the safety of your personal information.
</p>
<p>
All transactions are processed through a gateway provider and are not stored or processed on our servers.
</p>
<p>
<strong>Do we use "cookies"?</strong>
</p>
<p>
Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive
through your Web browser (if you allow) that enables the site's or service provider's systems to recognize
your browser and capture and remember certain information. For instance, we use cookies to help us
remember and process the items in your shopping cart. They are also used to help us understand your
preferences based on previous or current site activity, which enables us to provide you with improved
services. We also use cookies to help us compile aggregate data about site traffic and site interaction so
that we can offer better site experiences and tools in the future.
</p>
<p>
<strong>We use cookies to:</strong>
</p>
<ul>
<li>Help remember and process the items in the shopping cart.</li>
<li>
Compile aggregate data about site traffic and site interactions in order to offer better site
experiences and tools in the future. We may also use trusted third-party services that track this
information on our behalf.
</li>
</ul>
<p>
You can choose to have your computer warn you each time a cookie is being sent, or you can choose to turn
off all cookies. You do this through your browser settings. Since browser is a little different, look at
your browser's Help Menu to learn the correct way to modify your cookies.
</p>
<p>
<strong>If users disable cookies in their browser:</strong>
</p>
<p>If you turn cookies off it will turn off some of the features of the site.</p>
<p>
<strong>Third-party disclosure</strong>
</p>
<p>
We do not sell, trade, or otherwise transfer to outside parties your Personally Identifiable Information
unless we provide users with advance notice. This does not include website hosting partners and other
parties who assist us in operating our website, conducting our business, or serving our users, so long as
those parties agree to keep this information confidential. We may also release information when it's
release is appropriate to comply with the law, enforce our site policies, or protect ours or others'
rights, property or safety.
</p>
<p>
However, non-personally identifiable visitor information may be provided to other parties for marketing,
advertising, or other uses.
</p>
<p>
<strong>Third-party links</strong>
</p>
<p>
Occasionally, at our discretion, we may include or offer third-party products or services on our website.
These third-party sites have separate and independent privacy policies. We therefore have no
responsibility or liability for the content and activities of these linked sites. Nonetheless, we seek to
protect the integrity of our site and welcome any feedback about these sites.
</p>
<p>
<strong>Google</strong>
</p>
<p>
{' '}
As part of Odysee YouTube Sync Verification, we will only use read-only access to verify the ownership of
YouTube channels and will not transfer this data to others unless doing so is necessary to comply with
applicable law, or as part of a merger, acquisition, or sale of assets.
</p>
<p>
Google's advertising requirements can be summed up by Google's Advertising Principles. They are put in
place to provide a positive experience for users.{' '}
<code>https://support.google.com/adwordspolicy/answer/1316548?hl=en</code>
</p>
<p>We use Google AdSense Advertising on our website.</p>
<p>
Google, as a third-party vendor, uses cookies to serve ads on our site. Google's use of the DART cookie
enables it to serve ads to our users based on previous visits to our site and other sites on the Internet.
Users may opt-out of the use of the DART cookie by visiting the Google Ad and Content Network privacy
policy.
</p>
<p>
<strong>We have implemented the following:</strong>
</p>
<ul>
<li>Remarketing with Google AdSense</li>
<li>Google Display Network Impression Reporting</li>
<li>Demographics and Interests Reporting</li>
</ul>
<p>
We, along with third-party vendors such as Google use first-party cookies (such as the Google Analytics
cookies) and third-party cookies (such as the DoubleClick cookie) or other third-party identifiers
together to compile data regarding user interactions with ad impressions and other ad service functions as
they relate to our website.
</p>
<p>
<strong>Opting out:</strong>
</p>
<p>
Users can set preferences for how Google advertises to you using the Google Ad Settings page.
Alternatively, you can opt out by visiting the Network Advertising Initiative Opt Out page or by using the
Google Analytics Opt Out Browser add on.
</p>
<p>
<strong>California Online Privacy Protection Act</strong>
</p>
<p>
CalOPPA is the first state law in the nation to require commercial websites and online services to post a
privacy policy. The law's reach stretches well beyond California to require any person or company in the
United States (and conceivably the world) that operates websites collecting Personally Identifiable
Information from California consumers to post a conspicuous privacy policy on its website stating exactly
the information being collected and those individuals or companies with whom it is being shared. - See
more at:{' '}
<code>http://consumercal.org/california-online-privacy-protection-act-caloppa/#sthash.0FdRbT51.dpuf</code>
</p>
<p>
<strong>According to CalOPPA, we agree to the following:</strong>
</p>
<p>Users can visit our site anonymously.</p>
<p>
Once this privacy policy is created, we will add a link to it on our home page or as a minimum, on the
first significant page after entering our website.
</p>
<p>
Our Privacy Policy link includes the word 'Privacy' and can easily be found on the page specified above.
</p>
<p>You will be notified of any Privacy Policy changes:</p>
<ul>
<li>On our Privacy Policy Page</li>
</ul>
<p>Can change your personal information:</p>
<ul>
<li>By emailing us</li>
<li>By logging in to your account</li>
<li>By chatting with us or by sending us a support ticket</li>
</ul>
<p>
<strong>How does our site handle Do Not Track signals?</strong>
</p>
<p>
We honor Do Not Track signals and Do Not Track, plant cookies, or use advertising when a Do Not Track
(DNT) browser mechanism is in place.
</p>
<p>
<strong>Does our site allow third-party behavioral tracking?</strong>
</p>
<p>It's also important to note that we do not allow third-party behavioral tracking</p>
<p>
<strong>COPPA (Children Online Privacy Protection Act)</strong>
</p>
<p>
When it comes to the collection of personal information from children under the age of 13 years old, the
Children's Online Privacy Protection Act (COPPA) puts parents in control. The Federal Trade Commission,
United States' consumer protection agency, enforces the COPPA Rule, which spells out what operators of
websites and online services must do to protect children's privacy and safety online.
</p>
<p>We do not specifically market to children under the age of 13 years old.</p>
<p>Do we let third-parties, including ad networks or plug-ins collect PII from children under 13?</p>
<p>
<strong>Fair Information Practices</strong>
</p>
<p>
The Fair Information Practices Principles form the backbone of privacy law in the United States and the
concepts they include have played a significant role in the development of data protection laws around the
globe. Understanding the Fair Information Practice Principles and how they should be implemented is
critical to comply with the various privacy laws that protect personal information.
</p>
<p>
<strong>
In order to be in line with Fair Information Practices we will take the following responsive action,
should a data breach occur:
</strong>
</p>
<p>We will notify you via email:</p>
<ul>
<li>Within 7 business days</li>
</ul>
<p>We will notify the users via in-site notification:</p>
<ul>
<li>Within 7 business days</li>
</ul>
<p>
We also agree to the Individual Redress Principle which requires that individuals have the right to
legally pursue enforceable rights against data collectors and processors who fail to adhere to the law.
This principle requires not only that individuals have enforceable rights against data users, but also
that individuals have recourse to courts or government agencies to investigate and/or prosecute
non-compliance by data processors.
</p>
<p>
<strong>CAN SPAM Act</strong>
</p>
<p>
The CAN-SPAM Act is a law that sets the rules for commercial email, establishes requirements for
commercial messages, gives recipients the right to have emails stopped from being sent to them, and spells
out tough penalties for violations.
</p>
<p>
<strong>We collect your email address in order to:</strong>
</p>
<ul>
<li>Send information, respond to inquiries, and/or other requests or questions</li>
<li>Process orders and to send information and updates pertaining to orders.</li>
<li>Send you additional information related to your product and/or service</li>
<li>
Market to our mailing list or continue to send emails to our clients after the original transaction has
occurred.
</li>
</ul>
<p>
<strong>To be in accordance with CANSPAM, we agree to the following:</strong>
</p>
<ul>
<li>Not use false or misleading subjects or email addresses.</li>
<li>Identify the message as an advertisement in some reasonable way.</li>
<li>Include the physical address of our business or site headquarters.</li>
<li>Monitor third-party email marketing services for compliance, if one is used.</li>
<li>Honor opt-out/unsubscribe requests quickly.</li>
<li>Allow users to unsubscribe by using the link at the bottom of each email.</li>
</ul>
<p>
<strong>
If at any time you would like to unsubscribe from receiving future emails, you can email us at:
</strong>
</p>
<ul>
<li>Follow the instructions at the bottom of each email.</li>
</ul>
<p>
and we will promptly remove you from <strong>ALL</strong> correspondence.
</p>
<p>
<strong>Contacting Us</strong>
</p>
<p>
If there are any questions regarding this privacy policy, you may contact us using the information below.
</p>
<blockquote>
<p>Odysee Inc. 99 Hanover St Manchester, New Hampshire 03101 United States hello@odysee.com</p>
</blockquote>
<small>Last edited on 2021-10-08</small>
</div>
}
/>
</Page>
);
};
export default PrivacyPolicyPage;

2
web/page/tos/index.js Normal file
View file

@ -0,0 +1,2 @@
import PageTOS from './view';
export default PageTOS;

619
web/page/tos/view.jsx Normal file
View file

@ -0,0 +1,619 @@
// @flow
import React from 'react';
import Page from 'component/page';
import Card from 'component/common/card';
const TOSPage = () => {
return (
<Page>
<Card
title="Terms of Service"
body={
<div>
<p>
<strong>Last Updated: October 2021</strong>
</p>
<p>
<strong>
PLEASE READ THESE TERMS OF SERVICE CAREFULLY. NOTE THAT SECTION 16 CONTAINS A BINDING ARBITRATION CLAUSE
AND CLASS ACTION WAIVER, WHICH AFFECT YOUR LEGAL RIGHTS. IF YOU DO NOT AGREE TO THESE TERMS OF SERVICE,
DO NOT ACCESS OR USE THE SERVICES.
</strong>
</p>
<p>
By clicking to agree to these Terms of Service (<strong>Terms"</strong>) when running/installing our
software, publishing content to Odysee, or by otherwise accessing or using the network [via proxy or
direct], mobile applications and online services (collectively, our <strong>Services"</strong>) of Odysee
Inc. (<strong>Company," “we," or us"</strong>), you agree to be bound by these Terms. If you do not
agree to these Terms, you may not access or use the Services for any purpose. Please refer to our Privacy
Policy https://odysee.com/$/privacypolicy for information about how we collect, use and disclose
information about you.
</p>
<p>You and the Company agree as follows:</p>
<h3 id="toc_0">1. Overview of Odysee and the Services</h3>
<p>
<strong>Odysee"</strong> is a decentralized, consensus-driven protocol that enables the publication and
viewing of information, videos, music, data and other materials (<strong>Content"</strong>). Content is
distributed to Odysee by publishers and is stored in fragmented shards via a distributed network of
third-party devices (<strong>Hosts"</strong>) that utilize Odysee. Odysee also allows publishers to bid
on and reserve names (<strong>Names"</strong>), which can be used as a unique identifier for Content.
Please consult Odysee.tech to learn more about the technical architecture of Odysee.{' '}
</p>
<p>
The Services provide an interface for you to interact with Odysee, including to publish, access, or host
Content through Odysee. The Odysee protocol is not owned, operated, or maintained by us. We have no
responsibility or liability for Odysee, and the Company has no ability to control third parties use of
Odysee. We are not able to delete or remove Content that has been published through Odysee and that may be
accessible via the Services.{' '}
</p>
<h3 id="toc_1">2. Eligibility</h3>
<p>
You must be at least 13 years of age to access or use our Services. If you are under 18 years of age (or
the age of legal majority where you live), you may only access or use our Services under the supervision
of a parent or legal guardian who agrees to be bound by these Terms. If you are a parent or legal guardian
of a user under the age of 18 (or the age of legal majority), you will be fully responsible for the acts
or omissions of such user in connection with our Services. If you are accessing or using our Services on
behalf of another person or entity, you represent that you are authorized to accept these Terms on that
person or entitys behalf and that the person or entity agrees to be responsible to us if you or the other
person or entity violates these Terms.
</p>
<h3 id="toc_2">3. Publishing Content</h3>
<p>This section applies if you use the Services to publish Content through Odysee. </p>
<p>
a) You will make available via the Services a clear and accurate description of Content you publish, and
provide the Content in accordance with any descriptions or representations you make available about the
Content. You are solely responsible for resolving any disputes with users of your Content, including any
chargebacks or refunds, and for any and all injuries, illnesses, damages, claims, liabilities and costs
that are caused in whole or in part by you or your Content. Publishing to a blockchain is permanent. We
cannot remove published content from the blockchain itself, although we can block content accessed via our
app or other services on top of the blockchain.
</p>
<p>
b) Odysee enables publishers to offer Content for sale to other users by setting contract terms within the
metadata of the Content. Company, in its sole discretion, may from time to time impose limits on the
ability to sell Content via the Services. Upon the purchase of Content, you and the purchaser of your
Content will enter into a separate agreement, pursuant to which that purchaser agrees to pay the specified
fees for the Content and you agree to enable access to your Content. You are solely responsible for
providing refunds as required to comply with applicable law. You are responsible for determining what, if
any, taxes apply to your sale of Content, including, for example, sales, use, value added, and similar
taxes. It is also your responsibility to withhold, collect, report and remit the correct taxes to the
appropriate tax authorities. The Company is not responsible for withholding, collecting, reporting, or
remitting any sales, use, value added, or similar tax arising from any transaction completed via the
Services.
</p>
<p>
c) The Company is not a party to and has no responsibility or liability with respect to any
communications, transactions, interactions, disputes or any relations whatsoever between you and any users
of the Content. We will not be responsible for any loss, misuse, or deletion of Content or any failure of
any Content to be encrypted, stored or distributed.. You are solely responsible for your use of the
Services, including for configurations that you deem appropriate to determine access to your Content by
other users in a manner that meets your expectations. You are solely responsible for backing up any
Content. We are not responsible for any users access to your Content or any users misuse or
redistribution of Content.{' '}
</p>
<p>
d) You will not use the Services to reserve a Name that infringes any patent, trademark, trade secret,
copyright or other intellectual or proprietary right of any party.
</p>
<p>
e) We make no representations or warranties regarding the suitability of the Services for the distribution
and publishing of any particular types of data. By posting any Content or reserving a Name, you represent
and warrant that you have the lawful right, including all necessary intellectual property rights, to
distribute and reproduce such Content or use such Name for any purpose, commercial or otherwise. You will
provide all notices to, and obtain any consents from third parties as required by applicable law in
connection with the distribution and publishing of Content via the Services.{' '}
</p>
<p>f) You will not use the Services to distribute or publish Content that:</p>
<ul>
<li>
is unlawful, for example, copyrighted works, underage sexual content, revenge pornography, or any other
content illegal under US or state law.
</li>
<li>
would constitute, encourage or provide instructions for a criminal offense, violate the rights of any
party, or that would otherwise create liability or violate any applicable local, state, national or
international law;
</li>
<li>
infringes any patent, trademark, trade secret, copyright or other intellectual or proprietary right of
any party;
</li>
<li>
impersonates any person or entity or otherwise misrepresents your affiliation with a person or entity;
</li>
<li>
contains sensitive personal information, including "protected health information," as defined under
HIPAA and its implementing rules; cardholder data," as defined by the PCI DSS; “personal information"
of a child" as such terms are defined under the Childrens Online Privacy Protection Act and its
implementing rules; or personal data revealing racial or ethnic origin, political opinions, religious or
philosophical beliefs, or trade union membership, and the processing of genetic data, biometric data for
the purpose of uniquely identifying a natural person, data concerning health or data concerning a
natural person's sex life or sexual orientation;
</li>
<li>
contains viruses, corrupted data or other harmful, disruptive or destructive files; UNLESS CLEARLY
LABELED AS SUCH
</li>
<li>
in the sole judgment of the Company, is objectionable or which restricts or inhibits any other person
from using or enjoying Odysee or the Services, or which may expose the Company or its users to any harm
or liability of any type.
</li>
<li>
USD equivalent of Odysee Credits [LBC] is determined by 3rd party markets such as Bittrex and Poloniex,
not Odysee INC.
</li>
</ul>
<h3 id="toc_3">4. Accessing Content</h3>
<p>This section applies if you use the Services to access Content that has been stored through Odysee.</p>
<p>
a) In using our Services, you may view or otherwise interact with Content provided by publishers. Your
dealings or correspondence with any publisher of Content are solely between you and that publisher. The
Company is not responsible or liable for any damage or loss of any sort caused, or alleged to be caused,
by or in connection with any such dealings, including the delivery, quality, safety, legality or any other
aspect of any Content that you may access using our Services.
</p>
<p>
b) In certain instances, your access to Content may be subject to sale terms set forth in the metadata of
the Content. Company, in its sole discretion, may from time to time impose limits on the ability to
purchase Content via the Services. Upon your access of any purchased Content, you and the publisher will
enter into a separate agreement, pursuant to which you agree to pay the specified fees for the Content and
the publisher agrees to make such Content available to you. THE COMPANY DOES NOT HAVE THE POWER OR
RESPONSIBILITY TO PROVIDE ANY REFUNDS. You agree to look solely to the publisher to resolve any disputes
regarding Content, and that publishers are solely responsible for providing any refunds.
</p>
<p>
c) All payments for content will be made using LBC and occur on the Odysee blockchain. Purchaser is buying
the right to access content for personal non-commercial use unless content creator provides a license for
commercial use or remixing.
</p>
<h3 id="toc_4">5. Hosting Content</h3>
<p>
This section applies to you if you host any Content via Odysee using the Services. The Services allow
Hosts to make available storage space (<strong>Space"</strong>) on the Hosts device for the storage of
Content published through Odysee By making available Space on your device, you authorize any user of our
Services to: (i) store Content published through Odysee onto your device; and (ii) access such Content
from your device at any time.{' '}
</p>
<p>
a) You represent and warrant that (i) you own or control your device, and have the right to provide the
Space on your device pursuant to these Terms; and (ii) you will not breach any agreement to which you are
a party in connection with your performance under these Terms, including any agreement you have with a
third-party Internet service provider.{' '}
</p>
<p>
b) By allowing Space to be utilized to store Content distributed through Odysee, you understand that your
device may be impacted due to the additional constraints being placed on it by the processing of Content.
In particular, your device may not operate as quickly as it would without making Space available for
others to utilize.{' '}
</p>
<p>
c) You will not: (i) reverse engineer any aspect of the Content stored on your device or do anything that
might discover the contents or origin of the Content; (ii) attempt to bypass or circumvent measures
employed to prevent or limit access to the Content, including attempting to defeat any encryption; or
(iii) attempt to interfere with the storage or transmission of Content.
</p>
<h3 id="toc_5">6. General Conduct Restrictions</h3>
<p>
You are solely responsible for your conduct while using the Services. You will comply with all applicable
laws and third-party agreements to which you are bound. Further, you will not do any of the following in
connection with the Services or any other users:{' '}
</p>
<p>
a) Use the Services in any manner that could interfere with, disrupt, negatively affect or inhibit other
users from fully enjoying the Services or that could damage, disable, overburden or impair the functioning
of the Services in any manner;
</p>
<p>
b) Impersonate or distribute Content on behalf or any person or entity or otherwise misrepresent your
affiliation with a person or entity;
</p>
<p>c) Cheat or utilize unauthorized exploits in connection with the Services; </p>
<p>d) Stalk, intimidate, threaten, or otherwise harass or cause discomfort to other users; </p>
<p>
e) Send, distribute or post spam, unsolicited or bulk commercial electronic communications, chain letters,
or pyramid schemes;
</p>
<p>
f) Harvest or otherwise collect information about users, including email addresses, without their consent;
</p>
<p>
g) Use the Services for any illegal or unauthorized purpose or engage in, encourage, or promote any
illegal activity, or any activity that violates these Terms;{' '}
</p>
<p>
h) Use the Services to distribute Content that you do not have the lawful right to distribute or
reproduce; or
</p>
<p>
i) Circumvent or attempt to circumvent any filtering, security measures or other features we may from time
to time adopt to protect the Company, the Services, its users or third parties.
</p>
<p>
The Company does not endorse or adopt any Content and you acknowledge and agree that the Company will have
no responsibility for any Content, including without limitation, material that may be misleading,
incomplete, erroneous, offensive, indecent or otherwise objectionable. Enforcement of the Content rules
set forth in these Terms is solely at our discretion, and subject to our technical capabilities. Failure
to enforce such rules in some instances does not constitute a waiver of our right to enforce such rules in
other instances. In addition, these rules do not create any private right of action on the part of any
third party or any reasonable expectation that the Services will not link to any Content that is
prohibited by such rules.{' '}
</p>
<h3 id="toc_6">7. Limited License; Copyright and Trademark</h3>
<p>
Our Services and the text, graphics, images, photographs, illustrations, trademarks, trade names, service
marks, logos, slogans and other content contained therein (collectively, the{' '}
<strong>Company Marks"</strong>) are owned by Company and its licensors and are protected under both
United States and foreign laws, and may not be copied, imitated or used, in whole or in part, without our
or the applicable licensors prior written permission. You may not use any metatags or other hidden text"
utilizing any Company Marks without our prior written permission. Further, you may not use, frame or
utilize framing techniques to enclose any Company Mark, the content of any text or the layout or design of
any page or form contained on a page, on the Services without the Companys express written consent.
</p>
<h3 id="toc_7">8. Open Source Software</h3>
<p>
a) We may, from time to time, release the source code for certain of the software that supports our
Services. You agree to be bound by, and comply with, any license agreement that applies to this open
source software. You will not indicate that you are associated with Company in connection with any of your
modifications or distributions of this open source software.{' '}
</p>
<p>
b) The source code we release in connection with open source software is not part of the Services, and
your use of that source code without interacting with our Services is not subject to these Terms. For
clarity, though, when we host any software and enable you to access and use such software as a service
through our Services, then these Terms will apply to such access and use.{' '}
</p>
<h3 id="toc_8">9. YouTube Sync Program Terms</h3>
<p>
a) If you participate in the YouTube Sync Program, you also agree to{' '}
<a href="https://www.youtube.com/t/terms" rel="noopener">
YouTube's Terms of Service (https://www.youtube.com/t/terms)
</a>{' '}
and{' '}
<a href="https://www.google.com/policies/privacy" rel="noopener">
Google's Privacy Policy (https://www.google.com/policies/privacy).
</a>{' '}
</p>
<p>
b) To revoke Odysee's access to your YouTube account or manage your security preferences, please{' '}
<a href="https://security.google.com/settings/security/permissions" rel="noopener">
refer to your Google Security and Permissions Page
(https://security.google.com/settings/security/permissions).
</a>
</p>
<h3 id="toc_9">10. Feedback</h3>
<p>
Any questions, comments, suggestions, ideas, original or creative materials or other information you
submit about the Company or our products or Services (collectively, <strong>Feedback"</strong>), is
non-confidential and will become the sole property of the Company. We will own exclusive rights,
including, without limitation, all intellectual property rights, in and to Feedback and will be entitled
to the unrestricted use and dissemination of Feedback for any purpose, commercial or otherwise, without
acknowledgment or compensation to you.
</p>
<h3 id="toc_10">11. Copyright Complaints</h3>
<p>
We have a policy of limiting access to our Services and terminating the accounts of users who infringe the
intellectual property rights of others. If you believe that anything on our Services infringes any
copyright that you own or control, you may notify the Companys Designated Agent as follows:
</p>
<p>
Designated Agent: Odysee INC Address: 99 Hanover St, Manchester, NH 03101 Telephone Number: 907-318-5956
Fax Number: 801-327-6808
</p>
<p>E-Mail Address: hello@odysee.com</p>
<p>
Please see 17 U.S.C. §512(c)(3) for the requirements of a proper notification. Also, please note that if
you knowingly misrepresent that any activity or material on our Services is infringing, you may be liable
to the Company for certain costs and damages.
</p>
<h3 id="toc_11">12. Indemnification</h3>
<p>
To the fullest extent permitted by applicable law, you will indemnify, defend, and hold harmless the
Company and our officers, directors, agents, partners and employees (individually and collectively, the{' '}
<strong>Company Parties"</strong>) from and against any loss, liability, claim, demand, damages, expenses
or costs (including attorneys fees) (<strong>Claims"</strong>) arising out of or related to (a) your
access to or use of our Services; (b) your Content or any Name that you have reserved; (c) your violation
of these Terms; or (d) your violation, misappropriation or infringement of any rights of another
(including intellectual property rights or privacy rights). You agree to promptly notify Company Parties
of any third party Claims, cooperate with Company Parties in defending such Claims and pay all fees, costs
and expenses associated with defending such Claims (including, but not limited to, attorneys' fees). You
also agree that the Company Parties will have control of the defense or settlement of any third party
Claims. This indemnity is in addition to, and not in lieu of, any other indemnities set forth in a written
agreement between you and the Company or the other Company Parties.
</p>
<h3 id="toc_12">13. Disclaimers</h3>
<p>
<strong>
Your use of our Services is at your sole risk. Our Services are provided as is" and “as available"
without warranties of any kind, either express or implied, including, but not limited to, implied
warranties of merchantability, fitness for a particular purpose, title, and non-infringement. In
addition, the Company does not represent or warrant that our Services are accurate, complete, reliable,
current or error-free. While the Company attempts to make your access to and use of our Services safe,
we cannot and do not represent or warrant that our Services or servers are free of viruses or other
harmful components. You assume the entire risk as to the quality and performance of the Services.
</strong>
</p>
<h3 id="toc_13">14. Limitation of Liability</h3>
<p>
<strong>
The Company and the other Company Parties will not be liable to you under any theory of
liabilitywhether based in contract, tort, negligence, strict liability, warranty, or otherwisefor any
indirect, consequential, exemplary, incidental, special or punitive damages or lost profits, even if the
Company or the other Company Parties have been advised of the possibility of such damages.
</strong>
</p>
<p>
<strong>
The total liability of the Company and the other Company Parties, for any claim arising out of or
relating to these Terms or our Services, regardless of the form of the action, is limited to the greater
of any amount paid, if any, by you to access or use our Services or $100 USD.
</strong>
</p>
<p>
<strong>
The limitations set forth in this section will not limit or exclude liability for the gross negligence,
fraud or intentional misconduct of the Company or other Company Parties or for any other matters in
which liability cannot be excluded or limited under applicable law. Additionally, some jurisdictions do
not allow the exclusion or limitation of incidental or consequential damages, so the above limitations
or exclusions may not apply to you.
</strong>
</p>
<h3 id="toc_14">15. Release</h3>
<p>
To the fullest extent permitted by applicable law, you release the Company and the other Company Parties
from responsibility, liability, claims, demands and damages (actual and consequential) of every kind and
nature, known and unknown (including, but not limited to, claims of negligence), arising out of or related
to disputes between users and the acts or omissions of third parties.{' '}
<strong>
You expressly waive any rights you may have under California Civil Code § 1542 as well as any other
statute or common law principles that would otherwise limit the coverage of this release to include only
those claims which you may know or suspect to exist in your favor at the time of agreeing to this
release.
</strong>
</p>
<h3 id="toc_15">16. Dispute Resolution; Arbitration</h3>
<p>
<strong>
Please read the following section carefully because it requires you to arbitrate certain disputes and
claims with the Company and limits the manner in which you can seek relief from us.
</strong>
</p>
<h3 id="toc_16">16.1. Binding Arbitration</h3>
<p>
Except for any disputes, claims, suits, actions, causes of action, demands or proceedings (collectively,{' '}
<strong>Disputes"</strong>) in which either party seeks to bring an individual action in small claims
court or seeks injunctive or other equitable relief for the alleged unlawful use of intellectual property,
including, without limitation, copyrights, trademarks, trade names, logos, trade secrets or patents, you
and the Company (a) waive your and the Companys respective rights to have any and all Disputes arising
from or related to these Terms or the Services resolved in a court, and (b) waive your and the Companys
respective rights to a jury trial. Instead, you and the Company will arbitrate Disputes through binding
arbitration (which is the referral of a Dispute to one or more persons charged with reviewing the Dispute
and making a final and binding determination to resolve it instead of having the Dispute decided by a
judge or jury in court).
</p>
<h3 id="toc_17">16.2. No Class Arbitrations, Class Actions or Representative Actions</h3>
<p>
Any Dispute arising out of or related to these Terms or the Services is personal to you and the Company
and will be resolved solely through individual arbitration and will not be brought as a class arbitration,
class action or any other type of representative proceeding. There will be no class arbitration or
arbitration in which an individual attempts to resolve a Dispute as a representative of another individual
or group of individuals. Further, a Dispute cannot be brought as a class or other type of representative
action, whether within or outside of arbitration, or on behalf of any other individual or group of
individuals.
</p>
<h3 id="toc_18">16.3. Federal Arbitration Act</h3>
<p>
These Terms affect interstate commerce and the enforceability of this Section 16 will be both
substantively and procedurally governed by and construed and enforced in accordance with the Federal
Arbitration Act, 9 U.S.C. § 1 et seq. (the <strong>FAA"</strong>), to the maximum extent permitted by
applicable law.
</p>
<h3 id="toc_19">16.4. Notice; Informal Dispute Resolution</h3>
<p>
Each party will notify the other party in writing of any arbitrable or small claims Dispute within thirty
(30) days of the date it arises, so that the parties can attempt in good faith to resolve the Dispute
informally. Notice to the Company will be sent by e-mail to the Company at hello@odysee.com. Notice to you
will be by email to the then-current email address in your Account. Your notice must include (a) your
name, postal address, email address and telephone number, (b) a description in reasonable detail of the
nature or basis of the Dispute, and (c) the specific relief that you are seeking. If you and the Company
cannot agree how to resolve the Dispute within thirty (30) days after the date notice is received by the
applicable party, then either you or the Company may, as appropriate and in accordance with this Section
16, commence an arbitration proceeding or, to the extent specifically provided for in Section 17.1, file a
claim in court.{' '}
</p>
<h3 id="toc_20">16.5. Process</h3>
<p>
Any arbitration will occur in New Castle County, Delaware. Arbitration will be conducted confidentially by
a single arbitrator in accordance with the rules of the Judicial Arbitration and Mediation Services (
<strong>JAMS"</strong>), which are hereby incorporated by reference. The state and federal courts located
in New Castle County, Delaware will have exclusive jurisdiction over any appeals and the enforcement of an
arbitration award. You may also litigate a Dispute in the small claims court located in the county where
you reside if the Dispute meets the requirements to be heard in small claims court.{' '}
</p>
<h3 id="toc_21">16.6. Authority of Arbitrator</h3>
<p>
As limited by the FAA, these Terms and the applicable JAMS rules, the arbitrator will have (a) the
exclusive authority and jurisdiction to make all procedural and substantive decisions regarding a Dispute,
including the determination of whether a Dispute is arbitrable, and (b) the authority to grant any remedy
that would otherwise be available in court; provided, however, that the arbitrator does not have the
authority to conduct a class arbitration or a representative action, which is prohibited by these Terms.
The arbitrator may only conduct an individual arbitration and may not consolidate more than one
individuals claims, preside over any type of class or representative proceeding or preside over any
proceeding involving more than one individual.
</p>
<h3 id="toc_22">16.7. Rules of JAMS</h3>
<p>
The rules of JAMS and additional information about JAMS are available on the{' '}
<a href="http://www.jamsadr.com/" rel="noopener">
JAMS website.
</a>{' '}
By agreeing to be bound by these Terms, you either (a) acknowledge and agree that you have read and
understand the rules of JAMS, or (b) waive your opportunity to read the rules of JAMS and any claim that
the rules of JAMS are unfair or should not apply for any reason.
</p>
<h3 id="toc_23">17. Governing Law and Venue</h3>
<p>
These Terms and your access to and use of the Services will be governed by and construed and enforced in
accordance with the laws of the State of Delaware, without regard to conflict of law rules or principles
(whether of the State of Delaware or any other jurisdiction) that would cause the application of the laws
of any other jurisdiction. Any Dispute between the parties arising out of or relating to these Terms that
is not subject to arbitration or cannot be heard in small claims court will be resolved in the state or
federal courts of the State of Delaware and the United States, respectively, sitting in New Castle County,
Delaware.{' '}
</p>
<h3 id="toc_24">18. Severability</h3>
<p>
If any term, clause or provision of these Terms is held invalid or unenforceable, then that term, clause
or provision will be severable from these Terms and will not affect the validity or enforceability of any
remaining part of that term, clause or provision, or any other term, clause or provision of these Terms.
</p>
<h3 id="toc_25">19. Termination or Suspension</h3>
<p>
Notwithstanding anything contained in these Terms, we reserve the right, without notice and in our sole
discretion, to terminate this agreement or suspend your right to access the Services. You may terminate
this agreement without notice by discontinuing use of the Services. All rights and licenses granted to you
under these Terms will immediately be revoked upon our termination of the agreement or our suspension of
your access to the Services. We make no representations that termination or suspension of the Services
will prevent the spread or distribution of published Content through Odysee.
</p>
<h3 id="toc_26">20. Amendment</h3>
<p>
We reserve the right to change these Terms from time to time upon notice to you. If we make changes to
these Terms, we will provide notice of such changes by posting the revised Terms to the Services and
updating the Last Updated" date at the top of these Terms. In some cases, we may provide additional
notice to you, such as via our Services or to an email address associated with your Account. Your
continued use of the Services following our provision of any such notice will confirm your acceptance of
the revised Terms. If you do not agree to the modified Terms, you must stop using the Services.{' '}
</p>
<h3 id="toc_27">21. Survival</h3>
<p>
The following sections will survive the expiration or termination of these Terms: all defined terms and
Sections 12 - 18, 21 and 22.
</p>
<h3 id="toc_28">22. Miscellaneous</h3>
<p>
These Terms constitutes the entire agreement between you and the Company relating to your access to and
use of the Services. We may assign our rights and obligations under these Terms. Under no circumstances
may you assign your rights and obligations under these Terms, including in the event of change of control
or by operation of law, without our prior written consent. The failure of the Company to exercise or
enforce any right or provision of these Terms will not operate as a waiver of such right or provision. We
will not be liable for any delay or failure to perform any obligation under these Terms where the delay or
failure results from any cause beyond our reasonable control. Except as otherwise provided in herein, the
agreement is intended solely for the benefit of the parties and are not intended to confer third-party
beneficiary rights upon any other person or entity.
</p>
<h3 id="toc_28">23. Export Control and Prohibited Use</h3>
<p>
Use of the Service and Software, including transferring, posting, or uploading data, software or other
Content via the Service, may be subject to the export and import laws of the United States and other
countries. You agree to comply with all applicable export and import laws and regulations. In particular,
but without limitation, the Software may not be exported or re-exported (a) into any U.S. embargoed
countries or (b) to anyone on the U.S. Treasury Departments list of Specially Designated Nationals or the
U.S. Department of Commerce Denied Persons List or Entity List. By using the Software or Service, you
represent and warrant that you are not located in any such country or on any such list. You also agree
that you will not use the Software or Service for any purposes prohibited by United States law, including,
without limitation, the development, design, manufacture or production of missiles, nuclear, chemical or
biological weapons. You further agree not to upload to your Account any data or software that is: (a)
subject to International Traffic in Arms Regulations; or (b) that cannot be exported without prior written
government authorization, including, but not limited to, certain types of encryption software and source
code, without first obtaining that authorization. This assurance and commitment shall survive termination
of this Agreement.
</p>
</div>
}
/>
</Page>
);
};
export default TOSPage;

View file

@ -0,0 +1,2 @@
import PageYouTubeTOS from './view';
export default PageYouTubeTOS;

View file

@ -0,0 +1,619 @@
// @flow
import React from 'react';
import Page from 'component/page';
import Card from 'component/common/card';
const YouTubeTOSPage = () => {
return (
<Page>
<Card
title="YouTube Sync Terms of Service"
body={
<div>
<p>
<strong>Last Updated: October 2021</strong>
</p>
<p>
<strong>
PLEASE READ THESE TERMS OF SERVICE CAREFULLY. NOTE THAT SECTION 16 CONTAINS A BINDING ARBITRATION CLAUSE
AND CLASS ACTION WAIVER, WHICH AFFECT YOUR LEGAL RIGHTS. IF YOU DO NOT AGREE TO THESE TERMS OF SERVICE,
DO NOT ACCESS OR USE THE SERVICES.
</strong>
</p>
<p>
By clicking to agree to these Terms of Service (<strong>Terms"</strong>) when running/installing our
software, publishing content to LBRY, or by otherwise accessing or using the network [via proxy or
direct], mobile applications and online services (collectively, our <strong>Services"</strong>) of LBRY
Inc. (<strong>Company," “we," or us"</strong>), you agree to be bound by these Terms. If you do not
agree to these Terms, you may not access or use the Services for any purpose. Please refer to our Privacy
Policy https://odysee.com/$/privacypolicy for information about how we collect, use and disclose
information about you.
</p>
<p>You and the Company agree as follows:</p>
<h3 id="toc_0">1. Overview of LBRY and the Services</h3>
<p>
<strong>LBRY"</strong> is a decentralized, consensus-driven protocol that enables the publication and
viewing of information, videos, music, data and other materials (<strong>Content"</strong>). Content is
distributed to LBRY by publishers and is stored in fragmented shards via a distributed network of
third-party devices (<strong>Hosts"</strong>) that utilize LBRY. LBRY also allows publishers to bid on
and reserve names (<strong>Names"</strong>), which can be used as a unique identifier for Content. Please
consult lbry.tech to learn more about the technical architecture of LBRY.{' '}
</p>
<p>
The Services provide an interface for you to interact with LBRY, including to publish, access, or host
Content through LBRY. The LBRY protocol is not owned, operated, or maintained by us. We have no
responsibility or liability for LBRY, and the Company has no ability to control third parties use of
LBRY. We are not able to delete or remove Content that has been published through LBRY and that may be
accessible via the Services.{' '}
</p>
<h3 id="toc_1">2. Eligibility</h3>
<p>
You must be at least 13 years of age to access or use our Services. If you are under 18 years of age (or
the age of legal majority where you live), you may only access or use our Services under the supervision
of a parent or legal guardian who agrees to be bound by these Terms. If you are a parent or legal guardian
of a user under the age of 18 (or the age of legal majority), you will be fully responsible for the acts
or omissions of such user in connection with our Services. If you are accessing or using our Services on
behalf of another person or entity, you represent that you are authorized to accept these Terms on that
person or entitys behalf and that the person or entity agrees to be responsible to us if you or the other
person or entity violates these Terms.
</p>
<h3 id="toc_2">3. Publishing Content</h3>
<p>This section applies if you use the Services to publish Content through LBRY. </p>
<p>
a) You will make available via the Services a clear and accurate description of Content you publish, and
provide the Content in accordance with any descriptions or representations you make available about the
Content. You are solely responsible for resolving any disputes with users of your Content, including any
chargebacks or refunds, and for any and all injuries, illnesses, damages, claims, liabilities and costs
that are caused in whole or in part by you or your Content. Publishing to a blockchain is permanent. We
cannot remove published content from the blockchain itself, although we can block content accessed via our
app or other services on top of the blockchain.
</p>
<p>
b) LBRY enables publishers to offer Content for sale to other users by setting contract terms within the
metadata of the Content. Company, in its sole discretion, may from time to time impose limits on the
ability to sell Content via the Services. Upon the purchase of Content, you and the purchaser of your
Content will enter into a separate agreement, pursuant to which that purchaser agrees to pay the specified
fees for the Content and you agree to enable access to your Content. You are solely responsible for
providing refunds as required to comply with applicable law. You are responsible for determining what, if
any, taxes apply to your sale of Content, including, for example, sales, use, value added, and similar
taxes. It is also your responsibility to withhold, collect, report and remit the correct taxes to the
appropriate tax authorities. The Company is not responsible for withholding, collecting, reporting, or
remitting any sales, use, value added, or similar tax arising from any transaction completed via the
Services.
</p>
<p>
c) The Company is not a party to and has no responsibility or liability with respect to any
communications, transactions, interactions, disputes or any relations whatsoever between you and any users
of the Content. We will not be responsible for any loss, misuse, or deletion of Content or any failure of
any Content to be encrypted, stored or distributed.. You are solely responsible for your use of the
Services, including for configurations that you deem appropriate to determine access to your Content by
other users in a manner that meets your expectations. You are solely responsible for backing up any
Content. We are not responsible for any users access to your Content or any users misuse or
redistribution of Content.{' '}
</p>
<p>
d) You will not use the Services to reserve a Name that infringes any patent, trademark, trade secret,
copyright or other intellectual or proprietary right of any party.
</p>
<p>
e) We make no representations or warranties regarding the suitability of the Services for the distribution
and publishing of any particular types of data. By posting any Content or reserving a Name, you represent
and warrant that you have the lawful right, including all necessary intellectual property rights, to
distribute and reproduce such Content or use such Name for any purpose, commercial or otherwise. You will
provide all notices to, and obtain any consents from third parties as required by applicable law in
connection with the distribution and publishing of Content via the Services.{' '}
</p>
<p>f) You will not use the Services to distribute or publish Content that:</p>
<ul>
<li>
is unlawful, for example, copyrighted works, underage sexual content, revenge pornography, or any other
content illegal under US or state law.
</li>
<li>
would constitute, encourage or provide instructions for a criminal offense, violate the rights of any
party, or that would otherwise create liability or violate any applicable local, state, national or
international law;
</li>
<li>
infringes any patent, trademark, trade secret, copyright or other intellectual or proprietary right of
any party;
</li>
<li>
impersonates any person or entity or otherwise misrepresents your affiliation with a person or entity;
</li>
<li>
contains sensitive personal information, including "protected health information," as defined under
HIPAA and its implementing rules; cardholder data," as defined by the PCI DSS; “personal information"
of a child" as such terms are defined under the Childrens Online Privacy Protection Act and its
implementing rules; or personal data revealing racial or ethnic origin, political opinions, religious or
philosophical beliefs, or trade union membership, and the processing of genetic data, biometric data for
the purpose of uniquely identifying a natural person, data concerning health or data concerning a
natural person's sex life or sexual orientation;
</li>
<li>
contains viruses, corrupted data or other harmful, disruptive or destructive files; UNLESS CLEARLY
LABELED AS SUCH
</li>
<li>
in the sole judgment of the Company, is objectionable or which restricts or inhibits any other person
from using or enjoying LBRY or the Services, or which may expose the Company or its users to any harm or
liability of any type.
</li>
<li>
USD equivalent of LBRY Credits [LBC] is determined by 3rd party markets such as Bittrex and Poloniex,
not LBRY INC.
</li>
</ul>
<h3 id="toc_3">4. Accessing Content</h3>
<p>This section applies if you use the Services to access Content that has been stored through LBRY.</p>
<p>
a) In using our Services, you may view or otherwise interact with Content provided by publishers. Your
dealings or correspondence with any publisher of Content are solely between you and that publisher. The
Company is not responsible or liable for any damage or loss of any sort caused, or alleged to be caused,
by or in connection with any such dealings, including the delivery, quality, safety, legality or any other
aspect of any Content that you may access using our Services.
</p>
<p>
b) In certain instances, your access to Content may be subject to sale terms set forth in the metadata of
the Content. Company, in its sole discretion, may from time to time impose limits on the ability to
purchase Content via the Services. Upon your access of any purchased Content, you and the publisher will
enter into a separate agreement, pursuant to which you agree to pay the specified fees for the Content and
the publisher agrees to make such Content available to you. THE COMPANY DOES NOT HAVE THE POWER OR
RESPONSIBILITY TO PROVIDE ANY REFUNDS. You agree to look solely to the publisher to resolve any disputes
regarding Content, and that publishers are solely responsible for providing any refunds.
</p>
<p>
c) All payments for content will be made using LBC and occur on the LBRY blockchain. Purchaser is buying
the right to access content for personal non-commercial use unless content creator provides a license for
commercial use or remixing.
</p>
<h3 id="toc_4">5. Hosting Content</h3>
<p>
This section applies to you if you host any Content via LBRY using the Services. The Services allow Hosts
to make available storage space (<strong>Space"</strong>) on the Hosts device for the storage of Content
published through LBRY By making available Space on your device, you authorize any user of our Services
to: (i) store Content published through LBRY onto your device; and (ii) access such Content from your
device at any time.{' '}
</p>
<p>
a) You represent and warrant that (i) you own or control your device, and have the right to provide the
Space on your device pursuant to these Terms; and (ii) you will not breach any agreement to which you are
a party in connection with your performance under these Terms, including any agreement you have with a
third-party Internet service provider.{' '}
</p>
<p>
b) By allowing Space to be utilized to store Content distributed through LBRY, you understand that your
device may be impacted due to the additional constraints being placed on it by the processing of Content.
In particular, your device may not operate as quickly as it would without making Space available for
others to utilize.{' '}
</p>
<p>
c) You will not: (i) reverse engineer any aspect of the Content stored on your device or do anything that
might discover the contents or origin of the Content; (ii) attempt to bypass or circumvent measures
employed to prevent or limit access to the Content, including attempting to defeat any encryption; or
(iii) attempt to interfere with the storage or transmission of Content.
</p>
<h3 id="toc_5">6. General Conduct Restrictions</h3>
<p>
You are solely responsible for your conduct while using the Services. You will comply with all applicable
laws and third-party agreements to which you are bound. Further, you will not do any of the following in
connection with the Services or any other users:{' '}
</p>
<p>
a) Use the Services in any manner that could interfere with, disrupt, negatively affect or inhibit other
users from fully enjoying the Services or that could damage, disable, overburden or impair the functioning
of the Services in any manner;
</p>
<p>
b) Impersonate or distribute Content on behalf or any person or entity or otherwise misrepresent your
affiliation with a person or entity;
</p>
<p>c) Cheat or utilize unauthorized exploits in connection with the Services; </p>
<p>d) Stalk, intimidate, threaten, or otherwise harass or cause discomfort to other users; </p>
<p>
e) Send, distribute or post spam, unsolicited or bulk commercial electronic communications, chain letters,
or pyramid schemes;
</p>
<p>
f) Harvest or otherwise collect information about users, including email addresses, without their consent;
</p>
<p>
g) Use the Services for any illegal or unauthorized purpose or engage in, encourage, or promote any
illegal activity, or any activity that violates these Terms;{' '}
</p>
<p>
h) Use the Services to distribute Content that you do not have the lawful right to distribute or
reproduce; or
</p>
<p>
i) Circumvent or attempt to circumvent any filtering, security measures or other features we may from time
to time adopt to protect the Company, the Services, its users or third parties.
</p>
<p>
The Company does not endorse or adopt any Content and you acknowledge and agree that the Company will have
no responsibility for any Content, including without limitation, material that may be misleading,
incomplete, erroneous, offensive, indecent or otherwise objectionable. Enforcement of the Content rules
set forth in these Terms is solely at our discretion, and subject to our technical capabilities. Failure
to enforce such rules in some instances does not constitute a waiver of our right to enforce such rules in
other instances. In addition, these rules do not create any private right of action on the part of any
third party or any reasonable expectation that the Services will not link to any Content that is
prohibited by such rules.{' '}
</p>
<h3 id="toc_6">7. Limited License; Copyright and Trademark</h3>
<p>
Our Services and the text, graphics, images, photographs, illustrations, trademarks, trade names, service
marks, logos, slogans and other content contained therein (collectively, the{' '}
<strong>Company Marks"</strong>) are owned by Company and its licensors and are protected under both
United States and foreign laws, and may not be copied, imitated or used, in whole or in part, without our
or the applicable licensors prior written permission. You may not use any metatags or other hidden text"
utilizing any Company Marks without our prior written permission. Further, you may not use, frame or
utilize framing techniques to enclose any Company Mark, the content of any text or the layout or design of
any page or form contained on a page, on the Services without the Companys express written consent.
</p>
<h3 id="toc_7">8. Open Source Software</h3>
<p>
a) We may, from time to time, release the source code for certain of the software that supports our
Services. You agree to be bound by, and comply with, any license agreement that applies to this open
source software. You will not indicate that you are associated with Company in connection with any of your
modifications or distributions of this open source software.{' '}
</p>
<p>
b) The source code we release in connection with open source software is not part of the Services, and
your use of that source code without interacting with our Services is not subject to these Terms. For
clarity, though, when we host any software and enable you to access and use such software as a service
through our Services, then these Terms will apply to such access and use.{' '}
</p>
<h3 id="toc_8">9. YouTube Creator Program Terms</h3>
<p>
a) If you participate in the YouTube Creator Program, you also agree to{' '}
<a href="https://www.youtube.com/t/terms" rel="noopener">
YouTube's Terms of Service (https://www.youtube.com/t/terms)
</a>{' '}
and{' '}
<a href="https://www.google.com/policies/privacy" rel="noopener">
Google's Privacy Policy (https://www.google.com/policies/privacy).
</a>{' '}
</p>
<p>
b) To revoke LBRY's access to your YouTube account or manage your security preferences, please{' '}
<a href="https://security.google.com/settings/security/permissions" rel="noopener">
refer to your Google Security and Permissions Page
(https://security.google.com/settings/security/permissions).
</a>
</p>
<h3 id="toc_9">10. Feedback</h3>
<p>
Any questions, comments, suggestions, ideas, original or creative materials or other information you
submit about the Company or our products or Services (collectively, <strong>Feedback"</strong>), is
non-confidential and will become the sole property of the Company. We will own exclusive rights,
including, without limitation, all intellectual property rights, in and to Feedback and will be entitled
to the unrestricted use and dissemination of Feedback for any purpose, commercial or otherwise, without
acknowledgment or compensation to you.
</p>
<h3 id="toc_10">11. Copyright Complaints</h3>
<p>
We have a policy of limiting access to our Services and terminating the accounts of users who infringe the
intellectual property rights of others. If you believe that anything on our Services infringes any
copyright that you own or control, you may notify the Companys Designated Agent as follows:
</p>
<p>
Designated Agent: LBRY INC Address: 99 Hanover St, Manchester, NH 03101 Telephone Number: 907-318-5956 Fax
Number: 801-327-6808
</p>
<p>E-Mail Address: hello@odysee.com</p>
<p>
Please see 17 U.S.C. §512(c)(3) for the requirements of a proper notification. Also, please note that if
you knowingly misrepresent that any activity or material on our Services is infringing, you may be liable
to the Company for certain costs and damages.
</p>
<h3 id="toc_11">12. Indemnification</h3>
<p>
To the fullest extent permitted by applicable law, you will indemnify, defend, and hold harmless the
Company and our officers, directors, agents, partners and employees (individually and collectively, the{' '}
<strong>Company Parties"</strong>) from and against any loss, liability, claim, demand, damages, expenses
or costs (including attorneys fees) (<strong>Claims"</strong>) arising out of or related to (a) your
access to or use of our Services; (b) your Content or any Name that you have reserved; (c) your violation
of these Terms; or (d) your violation, misappropriation or infringement of any rights of another
(including intellectual property rights or privacy rights). You agree to promptly notify Company Parties
of any third party Claims, cooperate with Company Parties in defending such Claims and pay all fees, costs
and expenses associated with defending such Claims (including, but not limited to, attorneys' fees). You
also agree that the Company Parties will have control of the defense or settlement of any third party
Claims. This indemnity is in addition to, and not in lieu of, any other indemnities set forth in a written
agreement between you and the Company or the other Company Parties.
</p>
<h3 id="toc_12">13. Disclaimers</h3>
<p>
<strong>
Your use of our Services is at your sole risk. Our Services are provided as is" and “as available"
without warranties of any kind, either express or implied, including, but not limited to, implied
warranties of merchantability, fitness for a particular purpose, title, and non-infringement. In
addition, the Company does not represent or warrant that our Services are accurate, complete, reliable,
current or error-free. While the Company attempts to make your access to and use of our Services safe,
we cannot and do not represent or warrant that our Services or servers are free of viruses or other
harmful components. You assume the entire risk as to the quality and performance of the Services.
</strong>
</p>
<h3 id="toc_13">14. Limitation of Liability</h3>
<p>
<strong>
The Company and the other Company Parties will not be liable to you under any theory of
liabilitywhether based in contract, tort, negligence, strict liability, warranty, or otherwisefor any
indirect, consequential, exemplary, incidental, special or punitive damages or lost profits, even if the
Company or the other Company Parties have been advised of the possibility of such damages.
</strong>
</p>
<p>
<strong>
The total liability of the Company and the other Company Parties, for any claim arising out of or
relating to these Terms or our Services, regardless of the form of the action, is limited to the greater
of any amount paid, if any, by you to access or use our Services or $100 USD.
</strong>
</p>
<p>
<strong>
The limitations set forth in this section will not limit or exclude liability for the gross negligence,
fraud or intentional misconduct of the Company or other Company Parties or for any other matters in
which liability cannot be excluded or limited under applicable law. Additionally, some jurisdictions do
not allow the exclusion or limitation of incidental or consequential damages, so the above limitations
or exclusions may not apply to you.
</strong>
</p>
<h3 id="toc_14">15. Release</h3>
<p>
To the fullest extent permitted by applicable law, you release the Company and the other Company Parties
from responsibility, liability, claims, demands and damages (actual and consequential) of every kind and
nature, known and unknown (including, but not limited to, claims of negligence), arising out of or related
to disputes between users and the acts or omissions of third parties.{' '}
<strong>
You expressly waive any rights you may have under California Civil Code § 1542 as well as any other
statute or common law principles that would otherwise limit the coverage of this release to include only
those claims which you may know or suspect to exist in your favor at the time of agreeing to this
release.
</strong>
</p>
<h3 id="toc_15">16. Dispute Resolution; Arbitration</h3>
<p>
<strong>
Please read the following section carefully because it requires you to arbitrate certain disputes and
claims with the Company and limits the manner in which you can seek relief from us.
</strong>
</p>
<h3 id="toc_16">16.1. Binding Arbitration</h3>
<p>
Except for any disputes, claims, suits, actions, causes of action, demands or proceedings (collectively,{' '}
<strong>Disputes"</strong>) in which either party seeks to bring an individual action in small claims
court or seeks injunctive or other equitable relief for the alleged unlawful use of intellectual property,
including, without limitation, copyrights, trademarks, trade names, logos, trade secrets or patents, you
and the Company (a) waive your and the Companys respective rights to have any and all Disputes arising
from or related to these Terms or the Services resolved in a court, and (b) waive your and the Companys
respective rights to a jury trial. Instead, you and the Company will arbitrate Disputes through binding
arbitration (which is the referral of a Dispute to one or more persons charged with reviewing the Dispute
and making a final and binding determination to resolve it instead of having the Dispute decided by a
judge or jury in court).
</p>
<h3 id="toc_17">16.2. No Class Arbitrations, Class Actions or Representative Actions</h3>
<p>
Any Dispute arising out of or related to these Terms or the Services is personal to you and the Company
and will be resolved solely through individual arbitration and will not be brought as a class arbitration,
class action or any other type of representative proceeding. There will be no class arbitration or
arbitration in which an individual attempts to resolve a Dispute as a representative of another individual
or group of individuals. Further, a Dispute cannot be brought as a class or other type of representative
action, whether within or outside of arbitration, or on behalf of any other individual or group of
individuals.
</p>
<h3 id="toc_18">16.3. Federal Arbitration Act</h3>
<p>
These Terms affect interstate commerce and the enforceability of this Section 16 will be both
substantively and procedurally governed by and construed and enforced in accordance with the Federal
Arbitration Act, 9 U.S.C. § 1 et seq. (the <strong>FAA"</strong>), to the maximum extent permitted by
applicable law.
</p>
<h3 id="toc_19">16.4. Notice; Informal Dispute Resolution</h3>
<p>
Each party will notify the other party in writing of any arbitrable or small claims Dispute within thirty
(30) days of the date it arises, so that the parties can attempt in good faith to resolve the Dispute
informally. Notice to the Company will be sent by e-mail to the Company at hello@odysee.com. Notice to you
will be by email to the then-current email address in your Account. Your notice must include (a) your
name, postal address, email address and telephone number, (b) a description in reasonable detail of the
nature or basis of the Dispute, and (c) the specific relief that you are seeking. If you and the Company
cannot agree how to resolve the Dispute within thirty (30) days after the date notice is received by the
applicable party, then either you or the Company may, as appropriate and in accordance with this Section
16, commence an arbitration proceeding or, to the extent specifically provided for in Section 17.1, file a
claim in court.{' '}
</p>
<h3 id="toc_20">16.5. Process</h3>
<p>
Any arbitration will occur in New Castle County, Delaware. Arbitration will be conducted confidentially by
a single arbitrator in accordance with the rules of the Judicial Arbitration and Mediation Services (
<strong>JAMS"</strong>), which are hereby incorporated by reference. The state and federal courts located
in New Castle County, Delaware will have exclusive jurisdiction over any appeals and the enforcement of an
arbitration award. You may also litigate a Dispute in the small claims court located in the county where
you reside if the Dispute meets the requirements to be heard in small claims court.{' '}
</p>
<h3 id="toc_21">16.6. Authority of Arbitrator</h3>
<p>
As limited by the FAA, these Terms and the applicable JAMS rules, the arbitrator will have (a) the
exclusive authority and jurisdiction to make all procedural and substantive decisions regarding a Dispute,
including the determination of whether a Dispute is arbitrable, and (b) the authority to grant any remedy
that would otherwise be available in court; provided, however, that the arbitrator does not have the
authority to conduct a class arbitration or a representative action, which is prohibited by these Terms.
The arbitrator may only conduct an individual arbitration and may not consolidate more than one
individuals claims, preside over any type of class or representative proceeding or preside over any
proceeding involving more than one individual.
</p>
<h3 id="toc_22">16.7. Rules of JAMS</h3>
<p>
The rules of JAMS and additional information about JAMS are available on the{' '}
<a href="http://www.jamsadr.com/" rel="noopener">
JAMS website.
</a>{' '}
By agreeing to be bound by these Terms, you either (a) acknowledge and agree that you have read and
understand the rules of JAMS, or (b) waive your opportunity to read the rules of JAMS and any claim that
the rules of JAMS are unfair or should not apply for any reason.
</p>
<h3 id="toc_23">17. Governing Law and Venue</h3>
<p>
These Terms and your access to and use of the Services will be governed by and construed and enforced in
accordance with the laws of the State of Delaware, without regard to conflict of law rules or principles
(whether of the State of Delaware or any other jurisdiction) that would cause the application of the laws
of any other jurisdiction. Any Dispute between the parties arising out of or relating to these Terms that
is not subject to arbitration or cannot be heard in small claims court will be resolved in the state or
federal courts of the State of Delaware and the United States, respectively, sitting in New Castle County,
Delaware.{' '}
</p>
<h3 id="toc_24">18. Severability</h3>
<p>
If any term, clause or provision of these Terms is held invalid or unenforceable, then that term, clause
or provision will be severable from these Terms and will not affect the validity or enforceability of any
remaining part of that term, clause or provision, or any other term, clause or provision of these Terms.
</p>
<h3 id="toc_25">19. Termination or Suspension</h3>
<p>
Notwithstanding anything contained in these Terms, we reserve the right, without notice and in our sole
discretion, to terminate this agreement or suspend your right to access the Services. You may terminate
this agreement without notice by discontinuing use of the Services. All rights and licenses granted to you
under these Terms will immediately be revoked upon our termination of the agreement or our suspension of
your access to the Services. We make no representations that termination or suspension of the Services
will prevent the spread or distribution of published Content through LBRY.
</p>
<h3 id="toc_26">20. Amendment</h3>
<p>
We reserve the right to change these Terms from time to time upon notice to you. If we make changes to
these Terms, we will provide notice of such changes by posting the revised Terms to the Services and
updating the Last Updated" date at the top of these Terms. In some cases, we may provide additional
notice to you, such as via our Services or to an email address associated with your Account. Your
continued use of the Services following our provision of any such notice will confirm your acceptance of
the revised Terms. If you do not agree to the modified Terms, you must stop using the Services.{' '}
</p>
<h3 id="toc_27">21. Survival</h3>
<p>
The following sections will survive the expiration or termination of these Terms: all defined terms and
Sections 12 - 18, 21 and 22.
</p>
<h3 id="toc_28">22. Miscellaneous</h3>
<p>
These Terms constitutes the entire agreement between you and the Company relating to your access to and
use of the Services. We may assign our rights and obligations under these Terms. Under no circumstances
may you assign your rights and obligations under these Terms, including in the event of change of control
or by operation of law, without our prior written consent. The failure of the Company to exercise or
enforce any right or provision of these Terms will not operate as a waiver of such right or provision. We
will not be liable for any delay or failure to perform any obligation under these Terms where the delay or
failure results from any cause beyond our reasonable control. Except as otherwise provided in herein, the
agreement is intended solely for the benefit of the parties and are not intended to confer third-party
beneficiary rights upon any other person or entity.
</p>
<h3 id="toc_28">23. Export Control and Prohibited Use</h3>
<p>
Use of the Service and Software, including transferring, posting, or uploading data, software or other
Content via the Service, may be subject to the export and import laws of the United States and other
countries. You agree to comply with all applicable export and import laws and regulations. In particular,
but without limitation, the Software may not be exported or re-exported (a) into any U.S. embargoed
countries or (b) to anyone on the U.S. Treasury Departments list of Specially Designated Nationals or the
U.S. Department of Commerce Denied Persons List or Entity List. By using the Software or Service, you
represent and warrant that you are not located in any such country or on any such list. You also agree
that you will not use the Software or Service for any purposes prohibited by United States law, including,
without limitation, the development, design, manufacture or production of missiles, nuclear, chemical or
biological weapons. You further agree not to upload to your Account any data or software that is: (a)
subject to International Traffic in Arms Regulations; or (b) that cannot be exported without prior written
government authorization, including, but not limited to, certain types of encryption software and source
code, without first obtaining that authorization. This assurance and commitment shall survive termination
of this Agreement.
</p>
</div>
}
/>
</Page>
);
};
export default YouTubeTOSPage;

View file

@ -10,6 +10,8 @@ const {
SITE_NAME,
FAVICON,
LBRY_WEB_API,
THUMBNAIL_CDN_URL,
THUMBNAIL_QUALITY,
} = require('../../config.js');
const { Lbry } = require('lbry-redux');
@ -27,6 +29,31 @@ const SDK_API_PATH = `${LBRY_WEB_API}/api/v1`;
const PROXY_URL = `${SDK_API_PATH}/proxy`;
Lbry.setDaemonConnectionString(PROXY_URL);
function getThumbnailCdnUrl(url) {
if (!THUMBNAIL_CDN_URL || !url) {
return url;
}
const width = 630;
const height = 1200;
if (url && url.includes('https://twitter-card')) {
return url;
}
if (url && url.includes('https://spee.ch') && !url.includes('?quality=')) {
return `${url}?quality=${THUMBNAIL_QUALITY}&height=${height}&width=${width}`;
}
if (url && url.includes('https://spee.ch')) {
return url;
}
if (url) {
return url;
}
}
function insertToHead(fullHtml, htmlToInsert) {
const beginStr = '<!-- VARIABLE_HEAD_BEGIN -->';
const finalStr = '<!-- VARIABLE_HEAD_END -->';
@ -143,7 +170,7 @@ function buildClaimOgMetadata(uri, claim, overrideOptions = {}) {
const media = value && (value.video || value.audio || value.image);
const source = value && value.source;
const channel = signing_channel && signing_channel.name;
const thumbnail = value && value.thumbnail && value.thumbnail.url;
let thumbnail = value && value.thumbnail && value.thumbnail.url && getThumbnailCdnUrl(value.thumbnail.url);
const mediaType = source && source.media_type;
const mediaDuration = media && media.duration;
const claimTitle = escapeHtmlProperty((value && value.title) || claimName);
@ -230,7 +257,7 @@ function buildGoogleVideoMetadata(uri, claim) {
const { meta, value } = claim;
const media = value && value.video;
const source = value && value.source;
const thumbnail = value && value.thumbnail && value.thumbnail.url;
let thumbnail = value && value.thumbnail && value.thumbnail.url && getThumbnailCdnUrl(value.thumbnail.url);
const mediaType = source && source.media_type;
const mediaDuration = media && media.duration;
const claimTitle = escapeHtmlProperty((value && value.title) || claimName);

View file

@ -10173,9 +10173,9 @@ lazy-val@^1.0.4:
yargs "^13.2.2"
zstd-codec "^0.1.1"
lbry-redux@lbryio/lbry-redux#32b578707116d45f5b51b7ab523d200e75668676:
lbry-redux@lbryio/lbry-redux#0f930c4a7bfc7f164e6b3c6044050c1bc73f6ab8:
version "0.0.1"
resolved "https://codeload.github.com/lbryio/lbry-redux/tar.gz/32b578707116d45f5b51b7ab523d200e75668676"
resolved "https://codeload.github.com/lbryio/lbry-redux/tar.gz/0f930c4a7bfc7f164e6b3c6044050c1bc73f6ab8"
dependencies:
"@ungap/from-entries" "^0.2.1"
proxy-polyfill "0.1.6"