diff --git a/.env.defaults b/.env.defaults
index 2b9c4e373..48c0ebb66 100644
--- a/.env.defaults
+++ b/.env.defaults
@@ -15,10 +15,7 @@ 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://thumbnails.odysee.com/optimize/
-THUMBNAIL_HEIGHT=220
-THUMBNAIL_WIDTH=390
-THUMBNAIL_QUALITY=85
+THUMBNAIL_CDN_URL=https://image-processor.vanwanet.com/optimize/
WELCOME_VERSION=1.0
# STRIPE
diff --git a/.env.ody b/.env.ody
new file mode 100644
index 000000000..2d9e1313e
--- /dev/null
+++ b/.env.ody
@@ -0,0 +1,92 @@
+# 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
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 000000000..6f10abc1c
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,100 @@
+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/*.*
diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml
deleted file mode 100644
index 85a1436b9..000000000
--- a/.github/workflows/node.js.yml
+++ /dev/null
@@ -1,59 +0,0 @@
-# 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
diff --git a/.gitignore b/.gitignore
index f3adf8f8a..cef7245af 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,6 +33,6 @@ package-lock.json
!/custom/robots.disallowall
!/custom/robots.allowall
.env
-.env.ody
+!.env.ody
.env.desktop
.env.lbrytv
diff --git a/README.md b/README.md
index 0daf9f8b8..924bfa557 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,11 @@
+
-# Odysee Frontend - Odysee.com
+# LBRY App - https://lbry.tv
-This repo contains the UI and front end code that powers 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/).
@@ -25,6 +29,7 @@ This repo contains the UI and front end code that powers Odysee.com.
+![App GIF](https://spee.ch/ba/lbry-joule.gif)
## Table of Contents
@@ -165,6 +170,9 @@ This project is MIT licensed. For the full license, see [LICENSE](LICENSE).
## Security
-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).
+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).
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).
diff --git a/config.js b/config.js
index 7f25155ad..49e215c5b 100644
--- a/config.js
+++ b/config.js
@@ -22,9 +22,6 @@ 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,
diff --git a/package.json b/package.json
index 9b31e806e..6826b3296 100644
--- a/package.json
+++ b/package.json
@@ -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#0f930c4a7bfc7f164e6b3c6044050c1bc73f6ab8",
+ "lbry-redux": "lbryio/lbry-redux#32b578707116d45f5b51b7ab523d200e75668676",
"lbryinc": "lbryio/lbryinc#0b4e41ef90d6347819dd3453f2f9398a5c1b4f36",
"lint-staged": "^7.0.2",
"localforage": "^1.7.1",
diff --git a/ui/component/claimListDiscover/view.jsx b/ui/component/claimListDiscover/view.jsx
index c244b4206..e450a2c45 100644
--- a/ui/component/claimListDiscover/view.jsx
+++ b/ui/component/claimListDiscover/view.jsx
@@ -450,7 +450,7 @@ function ClaimListDiscover(props: Props) {
,
+ contact_support: ,
}}
>
If you continue to have issues, please %contact_support%.
diff --git a/ui/component/comment/view.jsx b/ui/component/comment/view.jsx
index 6fac77383..b4816303a 100644
--- a/ui/component/comment/view.jsx
+++ b/ui/component/comment/view.jsx
@@ -117,18 +117,12 @@ 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(showRepliesOnMount);
- const [page, setPage] = useState(showRepliesOnMount ? 1 : 0);
+ const [showReplies, setShowReplies] = useState(false);
+ const [page, setPage] = useState(0);
const [advancedEditor] = usePersistedState('comment-editor-mode', false);
const [displayDeadComment, setDisplayDeadComment] = React.useState(false);
const hasChannels = myChannels && myChannels.length > 0;
@@ -146,6 +140,19 @@ 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);
diff --git a/ui/component/commentsList/index.js b/ui/component/commentsList/index.js
index e9337e39d..c83dae73b 100644
--- a/ui/component/commentsList/index.js
+++ b/ui/component/commentsList/index.js
@@ -1,6 +1,5 @@
import { connect } from 'react-redux';
import {
- doResolveUris,
makeSelectClaimForUri,
makeSelectClaimIsMine,
selectFetchingMyChannels,
@@ -25,21 +24,11 @@ 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),
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),
@@ -60,7 +49,6 @@ 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);
diff --git a/ui/component/commentsList/view.jsx b/ui/component/commentsList/view.jsx
index a04e27a8d..debff2d0e 100644
--- a/ui/component/commentsList/view.jsx
+++ b/ui/component/commentsList/view.jsx
@@ -32,7 +32,6 @@ type Props = {
allCommentIds: any,
pinnedComments: Array,
topLevelComments: Array,
- resolvedComments: Array,
topLevelTotalPages: number,
uri: string,
claim: ?Claim,
@@ -48,9 +47,8 @@ type Props = {
othersReactsById: ?{ [string]: { [REACTION_TYPES.LIKE | REACTION_TYPES.DISLIKE]: number } },
activeChannelId: ?string,
settingsByChannelId: { [channelId: string]: PerChannelSettings },
- commentsAreExpanded?: boolean,
fetchReacts: (Array) => Promise,
- doResolveUris: (Array) => void,
+ commentsAreExpanded?: boolean,
fetchTopLevelComments: (string, number, number, number) => void,
fetchComment: (string) => void,
resetComments: (string) => void,
@@ -62,7 +60,6 @@ function CommentList(props: Props) {
uri,
pinnedComments,
topLevelComments,
- resolvedComments,
topLevelTotalPages,
claim,
claimIsMine,
@@ -77,9 +74,8 @@ function CommentList(props: Props) {
othersReactsById,
activeChannelId,
settingsByChannelId,
- commentsAreExpanded,
fetchReacts,
- doResolveUris,
+ commentsAreExpanded,
fetchTopLevelComments,
fetchComment,
resetComments,
@@ -225,16 +221,8 @@ function CommentList(props: Props) {
}
}, [hasDefaultExpansion, isFetchingComments, moreBelow, page, readyToDisplayComments, topLevelTotalPages]);
- // 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) => (
+ const getCommentElems = (comments) => {
+ return comments.map((comment) => (
));
+ };
- const sortButton = (label, icon, sortOption) => (
-