A browser and wallet for LBRY, the decentralized, user-controlled content marketplace.
Find a file
bluerabbit001 bfffc53a94 Implement Download Progress
Implement Download Progress

Revert "Stream Key Button (#7127)"

I forgot to lint before merging. Reverting for now, will fix in a bit.

This reverts commit 5c8878353f.

Restore "Stream Key Button (#7127)" + lint and modifications

- Consolidate functionality into existing component.
- Use proper strings.

Localize sunset nag

Changed the text a bit so that we can re-use the existing 'Learn more'.

Don't allow assigning yourself as moderator

Also fixed split-string (hard to localize).

Comment: Swap the order of "Edit" and "Remove"

This order is more common.

Blocklist page: fix perpetual spinner when trying to refresh with no channels

There's nothing to do when you don't have a channel, so hide the button and ensure redux fails gracefully.

i18n

Livestream category improvements (#7115)

*  Remove old method of displaying active livestreams

Completely remove it for now to make the commit deltas clearer.
We'll replace it with the new method at the end.

* Fetch and store active-livestream info in redux

* Tiles can now query active-livestream state from redux instead of getting from parent.

*  ClaimTilesDiscover: revert and cleanup

- Simplify to just `uris` instead of having multiple arrays (`uris`, `modifiedUris`, `prevUris`)
- The `prevUris` is for CLS prevention. With this removal, the CLS issue is back, but we'll handle it differently later.
- Temporarily disable the view-count fetching. Code is left there so that I don't forget.

- `shouldPerformSearch` was never true when `prefixUris` is present. Corrected the logic.
- Aside: prefix and pin is so similar in function. Hm ....

* ClaimTilesDiscover: factor out options

Move the `option` code outside and passed in as a pre-calculated prop.

To skip rendering while waiting for `claim_search`, we need to add `React.memo(areEqual)`. However, the flag that determines if we are fetching `claim_search` (fetchingClaimSearchByQuery[]) depends on the derived options as the key.

Instead of calculating `options` twice, we moved it to the props so both sides can use it.

It also makes the component a bit more readable.

The downside is that the prop-passing might not be clear.

* ClaimTilesDiscover: reduce ~17 renders at startup to just 2.

* ClaimTilesDiscover: fill with placeholder while waiting for claim_search

Livestream claims are fetched seperately, so they might already exists. While claim_search is running, the list only consists of livestreams (collapsed).

Fill up the space with placeholders to prevent layout shift.

* Add 'useFetchViewCount' to handle fetching from lists

This effect also stashes fetched uris, so that we won't re-fetch the same uris during the same instance (e.g. during infinite scroll).

*  ClaimListDiscover: revert and cleanup

- Removed the 'finalUris' stuff that was meant to "pause" visual changes when fetching. I think it'll be cleaner to use React.memo to achieve that.

- Added `renderUri` to make it clear which array that this component will render.
- Re-do the way we fetch view counts now that 'finalUris' is gone. Not the best method, but at least correct for now.

* ClaimListDiscover: add prefixUris, similar to ClaimTilesDiscover

This will be initially used to append livestreams at the top.

*  Re-enable active livestream tiles using the new method

* doFetchActiveLivestreams: add interval check

- Added a default minimum of 5 minutes between fetches. Clients can bypass this through `forceFetch` if needed.

* doFetchActiveLivestreams: add option check

We'll need to support different 'orderBy', so adding an "options check" when determining if we just made the same fetch.

* WildWest: limit livestream tiles + add ability to show more

Most likely this behavior will change in the future, so we'll leave `ClaimListDiscover` untouched and handle the logic at the page level.

This solution uses 2 `ClaimListDiscover` -- if the reduced livestream list is visible, it handles the header; else the normal list handles the header.

* Use better tile-count on larger screens.

Used the same method as how the homepage does it.

Fix video embeds in comments not playing and resize issues (#7163)

-- tmp revert --

This reverts commit 3b47edc3b9 to allow putting back in the original commits.

 Remove old method of displaying active livestreams

Completely remove it for now to make the commit deltas clearer.
We'll replace it with the new method at the end.

Fetch and store active-livestream info in redux

Tiles can now query active-livestream state from redux instead of getting from parent.

 ClaimTilesDiscover: revert and cleanup

- Simplify to just `uris` instead of having multiple arrays (`uris`, `modifiedUris`, `prevUris`)
- The `prevUris` is for CLS prevention. With this removal, the CLS issue is back, but we'll handle it differently later.
- Temporarily disable the view-count fetching. Code is left there so that I don't forget.

- `shouldPerformSearch` was never true when `prefixUris` is present. Corrected the logic.
- Aside: prefix and pin is so similar in function. Hm ....

ClaimTilesDiscover: factor out options

Move the `option` code outside and passed in as a pre-calculated prop.

To skip rendering while waiting for `claim_search`, we need to add `React.memo(areEqual)`. However, the flag that determines if we are fetching `claim_search` (fetchingClaimSearchByQuery[]) depends on the derived options as the key.

Instead of calculating `options` twice, we moved it to the props so both sides can use it.

It also makes the component a bit more readable.

The downside is that the prop-passing might not be clear.

ClaimTilesDiscover: reduce ~17 renders at startup to just 2.

ClaimTilesDiscover: fill with placeholder while waiting for claim_search

Livestream claims are fetched seperately, so they might already exists. While claim_search is running, the list only consists of livestreams (collapsed).

Fill up the space with placeholders to prevent layout shift.

Add 'useFetchViewCount' to handle fetching from lists

This effect also stashes fetched uris, so that we won't re-fetch the same uris during the same instance (e.g. during infinite scroll).

 ClaimListDiscover: revert and cleanup

- Removed the 'finalUris' stuff that was meant to "pause" visual changes when fetching. I think it'll be cleaner to use React.memo to achieve that.

- Added `renderUri` to make it clear which array that this component will render.
- Re-do the way we fetch view counts now that 'finalUris' is gone. Not the best method, but at least correct for now.

ClaimListDiscover: add prefixUris, similar to ClaimTilesDiscover

This will be initially used to append livestreams at the top.

 Re-enable active livestream tiles using the new method

doFetchActiveLivestreams: add interval and options checking

- Added a default minimum of 5 minutes between fetches. Clients can bypass this through `forceFetch` if needed.
- We'll need to support different 'orderBy', so adding an "options check" when determining if we just made the same fetch.

WildWest: limit livestream tiles + add ability to show more

Most likely this behavior will change in the future, so we'll leave `ClaimListDiscover` untouched and handle the logic at the page level.

This solution uses 2 `ClaimListDiscover` -- if the reduced livestream list is visible, it handles the header; else the normal list handles the header.

Fix homepage tiles not filtering blocked channels

7165 homepage queries don't take into account blocked channel ids (mute does)

resolveSearchOptions: was not grabbing redux data correctly.

Adjust comment fade-out height

6944 Comment expansion sometimes doesn't reveal extra text (already showing everything)

Reconcile some constants between JS and CSS.

force mp3 extension vs mpga

Fix autoplay next default value (#7173)

Fix missed render when blocklist is fetched

7176

Pitfalls of pausing render via React.memo:
  - We'll miss the `doClaimSearch()` since that is sparked by an `useEffect`.

Seems like we can't avoid having a redundant copy of the previously-displayed URIs.

Memoize 'mutedAndBlockedChannelIds'

It was being recalculated repeatedly.

This memoizes it, although it still re-calculates occasionally despite none of the source arrays changed. I think it is due to the state change in the Preference Sync.

Note: input selectors to `createSelector` needs to be extractions-only (i.e. must not have transformations). I think most of our `makeSelect*` selectors violate this and broke memoization.

Fix “Your Account” popup on mobile (#5652) (#7172)

* Fix “Your Account” popup on mobile (#5652)

* Update changelog

Co-authored-by: Branko Tomic <branko@spicefactory.co>

Fix issue where channel upload viewcounts were creating a new line (#7154)

* fix issue where viewcounts were creating a new line

* conditionally add large view css

* conditionally apply class based on if view count should be shown

* last couple touchups

* clean up the css

* add scss to flow config

* add scss component to flow config

use homepage LATEST for following discover (#7185)

Commentron now includes `replies` for `ByID` request

Wasn't aware of that, and that was causing 7146 ("show replies" visible when there are no replies).

Fix page titles for SiteLinks

Part of `7166 improve search metadata`, where page titles are important clues for Google to generate Site-Links.

Add icons (#7194)

fix playlist resolving collectionurls (#7178)

* fix playlist resolving collectionurls

* Update CHANGELOG.md

Co-authored-by: Thomas Zarebczan <tzarebczan@users.noreply.github.com>

Fix plant icon (#7195)

* Fix plant icon

* Also change phone icon name

Add Channel Mention selection ability (#7151)

* Add Channel Mention selection ability

* Fix mentioned user name being smaller than other text

* Improve logic for locating a mention

* Fix mentioning with enter on livestream

* Fix breaking for invalid URI query

* Handle punctuation after mention

* Fix name display and appeareance

* Use canonical url

* Fix missing search

i18n - ChannelMention and other fixes

Fix wrong 'recsysId' sent due to search-key mismatch

.../archives/C02FQBM00Q0/p1633044695010600

When querying a search key, it has to be an exact match. This was broken by the insertion of `free_only` in the fetch.

Added a function to generate the options, so that all clients stay in sync.

Fix linked-comment scrolling

I think this the best solution so far, at the expense of a slight delay in scrolling if the network call stalls.

- Added "fetching by ID" state so that we don't need to use the ugly N-retries method.
- `scrollIntoView` doesn't work if the element is already in the viewport, and the `scrollBy` adjustment doesn't take into account the y-position restoration that we perform on certain type of pages. Use `window.scrollTo` instead and taking into account current scroll position.

Prevent random description in Google Search results for "odysee" (#7206)

7166 improve search metadata

Depending on the search term and timing, Google extracts data from the sidebar or page content to use as the search-result description.

Defined `description` (on top of the existing `og:description` and `twitter:description`.

While I couldn't find a definitive doc saying that this is the solution, this is present in all other sites (and matches their description in a Google Search results).

Add favicon for Google Search results (#7205)

- A side-quest from "7166 improve search metadata".
- The favicon must be from the same domain as the homepage, so the CDN URL couldn't be used, hence the additional upload.
- The favicon also needs to be multiples of 48x48 and above.
    - Wanted to use SVG for the smallest size possible, but seems like Safari does not fully support it. Got Dejan to give me a reasonably-sized PNG.

https://developers.google.com/search/docs/advanced/appearance/favicon-in-search#guidelines

List own comments (#7171)

* Add option to pass in url-search params.

Impetus: allow linked comment ID and setting the discussion tab when clicking on the `ClaimPreview`.

* comment.list: fix typos and renamed variables

- Switch from 'author' to 'creator' to disambiguate between comment author and content author. For comment author, we'll use 'commenter' from now on.
- Corrected 'commenterClaimId' to 'creatorClaimId' (just a typo, no functional change).

* doCommentReset: change param from uri to claimId

This reduces one lookup as clients will always have the claimID ready, but might not have the full URI.

It was using URI previously just to match the other APIs.

* Add doCommentListOwn -- command to fetch own comments

Since the redux slice is set up based on content or channel ID (for Channel Discussion page), re-use the channel ID for the case of "own comments". We always clear each ID when fetching page-0, so no worries of conflict when actually browsing the Channel Discussion page.

* Comment: add option to hide the actions section

* Implement own-comments page

* Use new param to remove sort-pins-first.

comment.List currently always pushes pins to the top to support pagination. This new param removes this behavior.

Fix resolving invalid claims (#7210)

Update icons.js

--- tmp revert ---

This reverts commit de6c6f9bfd.

Add option to pass in url-search params.

Impetus: allow linked comment ID and setting the discussion tab when clicking on the `ClaimPreview`.

comment.list: fix typos and renamed variables

- Switch from 'author' to 'creator' to disambiguate between comment author and content author. For comment author, we'll use 'commenter' from now on.
- Corrected 'commenterClaimId' to 'creatorClaimId' (just a typo, no functional change).

doCommentReset: change param from uri to claimId

This reduces one lookup as clients will always have the claimID ready, but might not have the full URI.

It was using URI previously just to match the other APIs.

Add doCommentListOwn -- command to fetch own comments

Since the redux slice is set up based on content or channel ID (for Channel Discussion page), re-use the channel ID for the case of "own comments". We always clear each ID when fetching page-0, so no worries of conflict when actually browsing the Channel Discussion page.

Comment: add option to hide the actions section

Implement own-comments page

Use new param to remove sort-pins-first.

comment.List currently always pushes pins to the top to support pagination. This new param removes this behavior.

Corrected meta for "description" (patch for #7206)

It should be `name`, not `property`. Copy-paste error from the OG version.

Fix 'pinnedUrl' error.

Part of "6989 Fix console spam in dev"

EXTRA_SIDEBAR_LINKS should be a `SideNavLink` object, so trim down the return object from `GetLinksData`.

Temp workaround SDK 0 count

Temp workaround claims in channel count 0

patch creator analytics with hub without channel claim count

patch hubs claims_in_channel temporarily

OG: fix url for categories

Category cards are showing up as "odysee.com" cards in Facebook.

- `og:url` is supposed to be the canonical URL. It was hardcoded to "odysee.com", so every category was being redirected when the card is being generated.
- Removed `twitter:url`. The documentation says it will fall back to `og:url`, so there is not need to define both if it's the same.

OG: Technology category missing due to rename

- 'technology' was renamed to 'tech'.
- Leave both entries there for now. Not sure if other homepages still use the old link or not.

Fix spacing / centering live stream + comments section (#7225)

Add copy comment link menu option (#7224)

adjust css for toast message so that it behaves as expected (text truncation via ellipsis) (#7213)

Refactor commentsList

Remove expand/collapse from channel discussion page

Prevent comment content from breaking the layout on mobile

ESLint fix

Update Dark theme and fix playing issue

Fix playlist strings

Add sitemap to influence Sitelinks

Part of `7166 improve search metadata`

This is an experiment to influence the Sitelinks in our search results. Our current sitemap only consists of claims, so claims appear in Sitelinks more often. We (Julian) want categories to have higher priority, if possible.

For now, the sitemap will be defined in Google Console instead of robots.txt.

If it works, the file should be uploaded to sitemap.odysee.com, alongside the claim list sitemap.

Revert "Add sitemap to influence Sitelinks"

Seems like I messed up robots.txt?

This reverts commit 95654955b1.

Bump url-parse from 1.5.1 to 1.5.3 (#7230)

Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.3.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.3)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

fix notifications page on unauthed app (#7226)

move file actions from lbry-redux

Send video bitrate and user bandwidth to Watchman (#7145)

* adding functionality to detect user download speed

* calculating bandwidth speed more intelligently

* saving download speed and updating it every 30s

* all the functionality should be done needs testing

* fix linting

* use a 1mb file for calculating bandwidth

* add optional chaining plugin to babel and get bitrate from texttrack

* allow optional chaining for flow

* ignore flow error

* disable bandwidth checking functionality

* fix flow error

Fix ESLint

Update Download Progress

Update CSS
2021-11-13 15:58:18 -05:00
.github update csc for win 2021-10-26 11:33:20 -04:00
.tx make "I Understand" acknowledgement work for i18n case 2019-10-13 12:42:55 -04:00
build update csc for win 2021-10-26 11:33:20 -04:00
custom initial PR for custom homepages - take 2 2020-11-10 12:08:19 -05:00
electron integrate all the things 2021-10-15 23:49:41 -04:00
extras remove lbryinc web, update sitename, etc 2021-10-21 21:20:59 -04:00
flow-typed integrate all the things 2021-10-15 23:49:41 -04:00
homepages meme component2 2021-07-23 14:56:42 -04:00
static Implement Download Progress 2021-11-13 15:58:18 -05:00
ui Implement Download Progress 2021-11-13 15:58:18 -05:00
.env.defaults cloud connect 2021-10-22 16:39:45 -04:00
.env.ody Revert accidental commit from ody repo 2021-10-11 09:43:58 +08:00
.eslintignore stop linting my web build files please 2021-01-27 09:45:58 -05:00
.eslintrc Add pre-roll ads 2021-07-13 00:06:32 -04:00
.flowconfig more flow 2021-10-15 23:49:41 -04:00
.gitignore Revert accidental commit from ody repo 2021-10-11 09:43:58 +08:00
.lintstagedrc.json fix lint 2021-10-22 11:20:22 -04:00
.prettierrc.json redesign channel page 2019-05-06 23:29:50 -04:00
.sentryclirc update sentry config 2020-02-14 16:42:02 -05:00
babel.config.js use same code for handling open links on lbry.tv and desktop 2019-12-03 13:25:17 -05:00
CHANGELOG.md changelog lbrynet 103 bump 2021-10-25 13:14:44 -04:00
config.js cloud connect 2021-10-22 16:39:45 -04:00
CONTRIBUTING.md udpate readme 2021-04-21 11:06:29 -04:00
electron-builder.json remove 32 bit build 2021-01-25 14:24:57 -05:00
LICENSE Bump copyright year to 2021 2021-02-17 17:40:00 -05:00
package.json v0.52.0-rc.5 2021-10-26 11:34:11 -04:00
postcss.config.js redesign channel page 2019-05-06 23:29:50 -04:00
README.md Revert accidental commit from ody repo 2021-10-11 09:43:58 +08:00
webpack.base.config.js nudge 2021-10-15 23:49:41 -04:00
webpack.electron.config.js Initial commit for LBRY-First 2020-07-08 14:23:43 -04:00
yarn.lock integrate all the things 2021-10-15 23:49:41 -04:00

LBRY App - https://lbry.tv

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 protocol. It is essentially the lbry daemon bundled with a UI using Electron.

npm Build Status GitHub contributors

forthebadge forthebadge

App GIF

Table of Contents

  1. Install
  2. Usage
  3. Running from Source
  4. Contributing
  5. License
  6. Security
  7. Contact

Install

Windows Linux MacOS

We provide installers for Windows, macOS (v10.12.4, Sierra, or greater), and Debian-based Linux. See community maintained builds section for alternative Linux installations.

Windows macOS Linux
Latest Stable Release Download Download Download
Latest Pre-release Download Download Download

Our releases page also contains the latest release, pre-releases, and past builds. Note: If the deb fails to install using the Ubuntu Software Center, install manually via sudo dpkg -i <path to deb>. You'll need to run sudo apt-get install -f if this is the first time installing it to install dependencies

To install from source or make changes to the application, continue to the next section below.

Community maintained builds for Arch Linux and Flatpak are available, see below. These installs will need to be updated manually as the in-app update process only supports Debian installs at this time. Note: If coming from a deb install, the directory structure is different and you'll need to migrate data.

Flatpak Arch Nixpkgs ARM/ARM64
Latest Release FlatHub Page AUR Package Nixpkgs Build Guide
Maintainers @kcSeb @kcSeb @Enderger @Madiator2011

Usage

Double click the installed application to interact with the LBRY network.

Running from Source

You can run the web version (lbry.tv), the electron app, or both at the same time.

Prerequisites

  1. Clone (or fork) this repository: git clone https://github.com/lbryio/lbry-desktop
  2. Change directory into the cloned repository: cd lbry-desktop
  3. Install the dependencies: yarn

Run the electron app

yarn dev

  • If you want to build and launch the production app you can run yarn build. This will give you an executable inside the /dist folder. We use electron-builder to create distributable packages.

Run the web app for development

yarn dev:web

  • This uses webpack-dev-server and includes hot-reloading. If you want to debug the web server we use in production you can run yarn dev:web-server. This starts a server at localhost:1337 and does not include hot reloading.

Customize the web app

  • In root directory, duplicate the .env.default file and rename it to .env then copy the code below and paste it anywhere in the .env file.
cp .env.defaults .env
nano .env
  • To specify your own OG-IMAGE You can either place a png named v2-og.png in the /custom folder or specify the OG_IMAGE_URL in .env

  • To specify your own channels to be followed on first run AUTO_FOLLOW_URLS=lbry://@chan#123...a lbry://@chan2#456...a

  • If you want to customize the homepage content

  1. add CUSTOM_HOMEPAGE=true to the '.env' file
  2. copy /custom/homepage.example.js to /custom/homepage.js and make desired changes to homepage.js
  • If you want up to two custom sidebar links
PINNED_URI_1=@someurl#2/someclaim#4
PINNED_LABEL_1=Linktext

PINNED_URI_2=$/discover?t=tag&[queryparams]
PINNED_LABEL_2=OtherLinkText
  • Finally NODE_ENV=production yarn compile:web to rebuild Note: You don't need to edit the .env file in the /web folder - that is copied during compile.

Deploy the web app (experimental)

  1. Create a server with a domain name and a reverse proxy https to port 1337.
  2. Install pm2, node v10, yarn
  3. Clone this repo
  4. Make any customizations as above
  5. Run yarn to install
  6. Run NODE_ENV=production yarn compile:web to build
  7. Set up pm2 to start ./web/index.js

Run both at the same time

Run the two commands above in separate terminal windows

yarn dev

// in another terminal window
yarn dev:web

Resetting your Packages

If the app isn't building, or yarn xxx commands aren't working you may need to just reset your node_modules. To do so you can run: rm -r node_modules && yarn or del /s /q node_modules && yarn on Windows.

If you really think something might have gone wrong, you can force your repo to clear everything that doesn't match the repo with git reset --hard HEAD && git clean -fxd && git pull -r

Contributing

We ❤️ contributions from everyone and contributions to this project are encouraged, and compensated. We welcome bug reports, bug fixes and feedback is always appreciated. For more details, see CONTRIBUTING.md.

contributions welcome GitHub contributors

License

This project is MIT licensed. For the full license, see LICENSE.

Security

We take security seriously. Please contact security@lbry.com regarding any security issues. Our PGP key is here if you need it. Previous versions up to v0.50.2 were signed by Sean Yesmunt. New Releases are signed by Jessop Breth.

Contact

The primary contact for this project is @jessopb.