diff --git a/content/bounty/automatic-app-updates.md b/content/bounty/automatic-app-updates.md new file mode 100644 index 00000000..84a79592 --- /dev/null +++ b/content/bounty/automatic-app-updates.md @@ -0,0 +1,18 @@ +--- +category: browser +title: Automatic App Updates +award: 1000 +status: available +date: '2017-07-22' +--- + +The LBRY app currently does not update itself automatically, however electron does support this feature. + +To complete this bounty, [lbry-app](https://github.com/lbryio/lbry-app) must be modified as follows: + +- Detect when a new latest release is available, download it and prompt the user with a "Restart LBRY" / "I'll do it later" dialog to have the update take effect. +- Parse the changelog for the latest release, if it contains `Security` items carry out the update automatically without presenting the "I'll do it later" option. +- When an update begins store an update-history tracking file detailing what the version being updated is, what version it is being updated to, and when the update happened. +- Upon starting the app after an update, alert the user that the update was successful (and note if it contained security updates), and update the history file to indicate that the update was successful. + +It is probably a good idea to consult with our development team on [Slack](https://slack.lbry.io) or via email before completing this bounty in it's entirety. diff --git a/content/bounty/bittorrent-support.md b/content/bounty/bittorrent-support.md index 338e14f2..03c7a09b 100644 --- a/content/bounty/bittorrent-support.md +++ b/content/bounty/bittorrent-support.md @@ -6,22 +6,45 @@ status: available date: '2016-07-01' --- -Add support for the BitTorrent protocol to [`lbry`](https://github.com/lbryio/lbry). +Add support for the BitTorrent protocol to [`lbrynet`](https://github.com/lbryio/lbry) and [`lbryschema`](https://www.github.com/lbryio/lbryschema). -The LBRY blockchain supports storing metadata about media content. A simplified, sample entry looks like: +The LBRY blockchain supports storing metadata that can be resolved by a human friendly uri. +This metadata is defined by a flexible protobuf based schema, [lbryschema](https://www.github.com/lbryio/lbryschema). + +A simple example looks like: ``` -title: "What is LBRY?", -language: "en", -description: "What is LBRY? An introduction with Alex Tabarrok", -author: "Samuel Bryan", -sources: { - lbry_sd_hash : "d5169241150022f996fa7cd6a9a1c421937276a3275eb912790bd07ba7aec1fac5fd45431d226b8fb402691e79aeb24b" +{ + "version": "_0_0_1", + "claimType": "streamType", + "stream": { + "source": { + "source": "d5169241150022f996fa7cd6a9a1c421937276a3275eb912790bd07ba7aec1fac5fd45431d226b8fb402691e79aeb24b", + "version": "_0_0_1", + "contentType": "video/mp4", + "sourceType": "lbry_sd_hash" + }, + "version": "_0_0_1", + "metadata": { + "license": "LBRY inc", + "description": "What is LBRY? An introduction with Alex Tabarrok", + "language": "en", + "author": "Samuel Bryan", + "title": "What is LBRY?", + "version": "_0_1_0", + "nsfw": false, + "licenseUrl": "", + "preview": "", + "thumbnail": "https://s3.amazonaws.com/files.lbry.io/logo.png" + } + } } ``` -The `sources` field is designed to be extended and support resolution to multiple protocols. To complete this the LBRY daemon must be modified to: +The [source field](https://github.com/lbryio/lbryschema/blob/master/lbryschema/proto/source.proto) is designed to be extended and support resolution to multiple protocols. To complete this, lbryschema and lbrynet must be modified to: - Support the BitTorrent protocol via `python-libtorrent` or similar. -- Read `btih` as a source key and use this key to access the data via BitTorrent when requested +- Support the `sourceType` of `btih` in source.proto in lbryschema +- Add a BitTorrent downloader and factory for use in `EncryptedFileManager`, to be used as an alternative to `ManagedEncryptedFileDownloader` +- Use all of this to resolve a BTIH from a claim and download data via BitTorrent when requested - Probably a lot more stuff! diff --git a/content/bounty/typos-and-edits.md b/content/bounty/typos-and-edits.md index 2dc6b4cc..3cd08ffe 100644 --- a/content/bounty/typos-and-edits.md +++ b/content/bounty/typos-and-edits.md @@ -1,7 +1,7 @@ --- category: web title: Typos and Edits -award: 10 +award: 5 status: available date: '2016-11-01' --- @@ -10,4 +10,4 @@ This bounty is awarded for finding and correcting a typo, misspelling, or poor p This includes everything from low-level help messages or comments in code to the copy of the website itself. -Please initiate a pull-request on GitHub to receive this bounty. +Please initiate a pull request on GitHub to receive this bounty. diff --git a/content/faq/credit-policy.md b/content/faq/credit-policy.md index 5f2110fe..b70ff1d6 100644 --- a/content/faq/credit-policy.md +++ b/content/faq/credit-policy.md @@ -57,7 +57,7 @@ Should LBRY make placements from this fund, it will seek long-term engagements a ## Institutional Fund -The Institutional Fund is 100m LBC reserved for the formation of institutional partnerships and benefiting organizations of need, and institutional partnerships, grants, donations, and other ways of strengthening relationships with organizations of need or like-mindedness. +The Institutional Fund is 100m LBC reserved for the formation of institutional partnerships, and for grants, donations, and other ways of strengthening relationships with organizations of need or like-mindedness. Sample usages of this fund include: diff --git a/content/faq/exchanges.md b/content/faq/exchanges.md index 0bd3eb5d..d8fa7d0f 100644 --- a/content/faq/exchanges.md +++ b/content/faq/exchanges.md @@ -9,4 +9,5 @@ We are listed on several exchanges. You can buy or sell credits at one of these: - [Poloniex](https://poloniex.com/exchange#btc_lbc) - [Shapeshift](https://shapeshift.io) - [Changelly](https://changelly.com/exchange/BTC/LBC/1) -- [BitSquare](https://bitsquare.io/) \ No newline at end of file +- [BitSquare](https://bitsquare.io/) +- [Cryptopia](https://www.cryptopia.co.nz/Exchange/?market=LBC_BTC) diff --git a/content/faq/host-content.md b/content/faq/host-content.md index 778ea097..ff484235 100644 --- a/content/faq/host-content.md +++ b/content/faq/host-content.md @@ -7,8 +7,7 @@ Right now, it's simple: you host what you download. While the LBRY app is running, it communicates to the network what content you're making available. If somebody downloads content from -you, you will receive LBRY Credits (LBC) for that. The prices are -currently set by the app and can't be changed. +you, you will receive LBRY credits (LBC) for the data you upload. Think of it like how torrents or any other peer-to-peer (P2P) service works. First you download a file from the hosts that have it available. diff --git a/content/faq/how-to-stop-lbry.md b/content/faq/how-to-stop-lbry.md index 5cdaef03..264f731b 100644 --- a/content/faq/how-to-stop-lbry.md +++ b/content/faq/how-to-stop-lbry.md @@ -3,4 +3,4 @@ title: How do I stop LBRY from the command line? category: setup --- -You can ctrl-c or run `stop-lbrynet-daemon`. It is natural for the program to take 2-3 seconds to close. +You can press `ctrl-c` or run `lbrynet-cli daemon_stop`. It is natural for the program to take 2-3 seconds to close. diff --git a/content/faq/mining-pools.md b/content/faq/mining-pools.md index 58e5e30c..3f42e33e 100644 --- a/content/faq/mining-pools.md +++ b/content/faq/mining-pools.md @@ -12,3 +12,4 @@ While we try to work with reliable pool operators, LBRY does not officially run - [MaxMiners](https://maxminers.net/lbry/index.php?page=gettingstarted) - [YIIMP](http://yiimp.ccminer.org/site/mining/lbry) - [CoinQuarry](https://mining.coinquarry.org/) +- [AikaPool](https://aikapool.com/lbry/index.php?page=gettingstarted) diff --git a/content/faq/standalone-wallet.md b/content/faq/standalone-wallet.md index 90811f05..52bf6ecb 100644 --- a/content/faq/standalone-wallet.md +++ b/content/faq/standalone-wallet.md @@ -3,4 +3,13 @@ title: Is there a standalone wallet? category: wallet --- -Yes, please visit [Coinomi](http://www.coinomi.com) to download their excellent wallet. +Yes, please visit [Coinomi](http://www.coinomi.com) to download their excellent and easy to use wallet. + +For technical users we have [lbrycrd](https://github.com/lbryio/lbrycrd/releases), a full blockchain node very similar to bitcoind. You'll need to set up a `lbrycrd.conf` file in the `lbrycrd` [directory for your OS](https://lbry.io/faq/lbry-directories) with values for `rpcuser` and `rpcpassword` provided. For example: + + ``` + rpcuser=lbryrpc + rpcpassword=do_not_copy_paste_this_password + ``` + +The lbrycrdd daemon can be started with `lbrycrdd -server -printtoconsole`. For help using the command line, `lbrycrd-cli help`. diff --git a/content/faq/to-log-to-console.md b/content/faq/to-log-to-console.md index 75779493..39077ec6 100644 --- a/content/faq/to-log-to-console.md +++ b/content/faq/to-log-to-console.md @@ -3,6 +3,4 @@ title: How can I see the log in the terminal? category: developer --- -Run LBRY with the `--log-to-console` flag set: - - lbrynet-daemon --log-to-console +Simply run `lbry`, or the daemon `lbrynet-daemon`, in a terminal. diff --git a/content/news/117-jordanbpeterson.md b/content/news/117-jordanbpeterson.md new file mode 100644 index 00000000..870fe9b8 --- /dev/null +++ b/content/news/117-jordanbpeterson.md @@ -0,0 +1,31 @@ +--- +author: reilly +title: 'The Root of All Good' +date: '2017-06-23 00:10:00' +cover: 'jordan-banner.jpg' +--- +People do strange things for seemingly mystical reasons. + +Jordan Peterson cuts through the myst and gets to the heart of, well, everyone’s heart. + +![Jordan B Peterson](/img/news/jordan-inline.jpg) + +A professor and psychologist at the University of Toronto, Dr. Peterson has lectured, written and made videos covering some of the most deeply profound topics of our time in an accessible way. From [postmodernism](lbry://jp-Urd0IK0WEWU), to what the Bible [says about our relationship to authority](lbry://jp-R-GPAl-q2QQ), to [debating house bill C16](lbry://jp-KnIAAkSNtqo), he covers the root of humanity’s collective psychology in earnest. + +A commenter on his Biblical series summarized his channel best: + +📂Documents + + └📁Videos + + └📁 Jordan B Peterson + └📁 Bad Videos + └⚠️ This folder is empty + +Check out some of the best lectures on LBRY at: + +- lbry://@JordanBPeterson + +You can learn more about Dr. Peterson, and [pre-order his next book](https://jordanbpeterson.com/12-rules-for-life/), here on his [website](https://jordanbpeterson.com/). + +**Not on LBRY yet?** [Get an invite here](https://lbry.io/get). Know the meaning of life? Email reilly@lbry.io because he’s desperate to know. Or sync your channel at: https://api.lbry.io/yt/connect diff --git a/content/news/118-lukehall.md b/content/news/118-lukehall.md new file mode 100644 index 00000000..deb773b4 --- /dev/null +++ b/content/news/118-lukehall.md @@ -0,0 +1,23 @@ +--- +author: reilly +title: 'Young Gun' +date: '2017-06-29 00:10:00' +cover: 'lukehall-banner.jpg' +--- +Continuing with our slate of indie musicians is a young, entrepreneurial artist we found on Twitter. + +When we mean LBRY enables anyone to monetize content, we mean from the biggest Disneys to the self-made fresh EPs of artists taking their first leap of faith. It’s a level playing field. + +![Luke Hall](/img/news/lukehall-inline.jpg) + +Luke Hall recently released his debut EP, and spent no time learning the ropes of LBRY. I was so blown away by his commitment to learning LBRY hands-on after a shout-out on Twitter. + +This is the first channel I know on LBRY to host a variety of multimedia options--hat tip to Matt Skokol for [his musicians guide to publishing](https://medium.com/@heymattsokol/how-to-upload-and-sell-your-music-on-lbry-fa4f299413a1)--from music videos to mp3 streams to a full downloadable album, everything a musician could offer is available on Luke Hall’s LBRY channel at a variety of prices. + +Please do yourselves the honor, and get your indie electronica on at: + +@iamlukehall + +pieceofmind-mp3bundle + +**Not on LBRY yet?** [Get an invite here](https://lbry.io/get). Can you make sick beats? Email reilly@lbry.io because he’s still listening to the same things he did at university eight years ago. Or sync your channel at: https://api.lbry.io/yt/connect diff --git a/content/news/57-lbry-bounties.md b/content/news/57-lbry-bounties.md index 8093ea43..3d9f0050 100644 --- a/content/news/57-lbry-bounties.md +++ b/content/news/57-lbry-bounties.md @@ -14,17 +14,16 @@ On our [official bounty page](https://lbry.io/bounty), you’ll find details for The bounty list will be constantly growing, so bookmark it and check in regularly for updates. You’ll currently find: -- [Adding support for BitTorrent](https://lbry.io/bounty/bittorrent-support) – 4,000 LBC -- [Add transaction history to LBRY browser](https://lbry.io/bounty/transaction-history) – 2,000 LBC -- [Modified block explorer](https://lbry.io/bounty/modified-block-explorer) – 1,500 LBC -- [PKG installer for OS X](https://lbry.io/bounty/pkg-installer-for-osx) – 1,500 LBC -- [Create URL handler for Slack](https://lbry.io/bounty/slack-lbry-url-handler) – 1,000 LBC -- [Internationalization of lbry.io](https://lbry.io/bounty/web-i18n) – 1,000 LBC -- [LBRY Community Rep](https://lbry.io/bounty/lbry-club) – 500 LBC -- [Write, broadcast or share LBRY](https://lbry.io/bounty/pr-for-lbry) – 500 LBC -- [Create social media cover images](https://lbry.io/bounty/social-media-cover-images) - 400 LBC -- [Publish open content](https://lbry.io/bounty/publish-open-content) – 250-1,000+ LBC -- [Refer a publisher to LBRY](https://lbry.io/bounty/refer-publisher) – 100 LBC +- [Adding support for BitTorrent](https://lbry.io/bounty/bittorrent-support) – 17,660 LBC +- [Adding support for HTTP](https://lbry.io/bounty/http-support) – 5,220 LBC +- [Internationalization of lbry.io](https://lbry.io/bounty/web-i18n) – 3,530 LBC +- [LBRY Community Rep](https://lbry.io/bounty/lbry-club) – 530 LBC +- [Write, broadcast or share LBRY](https://lbry.io/bounty/pr-for-lbry) – 440 LBC +- [Publish open content](https://lbry.io/bounty/publish-open-content) – 500-10,000+ LBC +- [Refer a publisher to LBRY](https://lbry.io/bounty/refer-publisher) – 440 LBC +- [Automatic App Updates](https://lbry.io/bounty/automatic-app-updates) – 1,740 LBC +- [Custom Project](https://lbry.io/bounty/custom-project) – 250-50,000+ LBC +- [Typos and Edits](https://lbry.io/bounty/typos-and-edits) – 5-10 LBC You can even [pitch us your own custom project](https://lbry.io/bounty/custom-project) and earn as much as *20,000 LBC* (reward determined by LBRY team). diff --git a/controller/Controller.class.php b/controller/Controller.class.php index 061535d8..b78ba7bc 100644 --- a/controller/Controller.class.php +++ b/controller/Controller.class.php @@ -134,7 +134,7 @@ class Controller '/api' => 'https://lbryio.github.io/lbry', '/api-help' => 'https://lbryio.github.io/lbry', '/security' => '/faq/security', - '/live' => 'https://www.youtube.com/channel/UCXAcp3dJuPqeUekOacsuyaQ', + '/live' => 'https://www.youtube.com/watch?v=WM60vLOCRps', //'https://www.youtube.com/channel/UCXAcp3dJuPqeUekOacsuyaQ', ]; diff --git a/controller/action/ContentActions.class.php b/controller/action/ContentActions.class.php index 34c22016..95d3884f 100644 --- a/controller/action/ContentActions.class.php +++ b/controller/action/ContentActions.class.php @@ -220,9 +220,9 @@ class ContentActions extends Actions { $lastItem = end($items); $project = $lastItem['project']; - if (!isset($projectMaxVersions[$project]) || strnatcasecmp($lastItem['version'], $projectMaxVersions[$project]) > 0) + if (!isset($projectMaxVersions[$project]) || $lastItem['sort_key'] > $projectMaxVersions[$project]) { - $projectMaxVersions[$project] = $lastItem['version']; + $projectMaxVersions[$project] = $lastItem['sort_key']; } } } diff --git a/lib/thirdparty/Asana.class.php b/lib/thirdparty/Asana.class.php index 3ce983b3..2032d930 100644 --- a/lib/thirdparty/Asana.class.php +++ b/lib/thirdparty/Asana.class.php @@ -19,7 +19,7 @@ class Asana $tasks = []; $tags = [ - 192699565737944 => 'Ongoing', + 192699565737944 => 'Open Beta', 192699565737946 => 'Upcoming', 192699565737948 => 'Future' ]; @@ -40,12 +40,14 @@ class Asana else { $projectName = 'Other'; + $projectId = null; } $tasks[$tagLabel][] = array_intersect_key($fullTask, ['name' => null]) + [ 'badge' => $projectName, 'date' => $fullTask['due_on'] ?? null, - 'body' => nl2br($fullTask['notes']) , + 'body' => nl2br($fullTask['notes']), 'group' => $tagLabel, + 'project_id' => $projectId, 'assignee' => $fullTask['assignee'] ? ucwords($fullTask['assignee']['name']) : '' ]; } @@ -64,6 +66,10 @@ class Asana { return $tA['date'] ? -1 : 1; } + if ($tA['project_id'] xor $tB['project_id']) + { + return $tA['project_id'] ? -1 : 1; + } return $tA['date'] < $tB['date'] ? -1 : 1; }); } diff --git a/lib/thirdparty/Github.class.php b/lib/thirdparty/Github.class.php index 848040c7..61cc9dfa 100644 --- a/lib/thirdparty/Github.class.php +++ b/lib/thirdparty/Github.class.php @@ -106,21 +106,24 @@ class Github $sets = []; $allReleases = []; - $project = 'lbry'; - $page = 1; + $projects = ['lbry' => 'Daemon', 'lbry-app' => 'App']; - do + foreach($projects as $project => $projectLabel) { - $releases = static::get('/repos/lbryio/' . $project . '/releases?page=' . $page, $cache); - $page++; - $allReleases = array_merge($allReleases, array_map(function ($release) use ($project) + $page = 1; + do { - return $release + ['project' => $project]; - }, array_filter($releases, function ($release) - { - return ($release['tag_name'] ?? null) && ($release['published_at'] ?? null) && !$release['prerelease']; - }))); - } while (count($releases) >= 30); + $releases = static::get('/repos/lbryio/' . $project . '/releases?page=' . $page, $cache); + $page++; + $allReleases = array_merge($allReleases, array_map(function ($release) use ($project, $projectLabel) + { + return $release + ['project' => $projectLabel]; + }, array_filter($releases, function ($release) + { + return isset($release['tag_name']) && isset($release['published_at']) && $release['published_at']; + }))); + } while (count($releases) >= 30); + } foreach ($allReleases as $release) { @@ -128,23 +131,36 @@ class Github $matches = null; if (preg_match('/^v(\d+)\.(\d+)\./', $release['tag_name'] ?? '', $matches)) { - $group = 'v' . $matches[1] . '.' . $matches[2]; + $group = $release['project'] . ' v' . $matches[1] . '.' . $matches[2]; } if ($group) { - $sets[$group][] = [ - 'project' => $release['project'], - 'date' => date('Y-m-d', strtotime($release['created_at'])), - 'created_at' => $release['created_at'], - 'name' => $release['name'] ?: $release['tag_name'], - 'url' => $release['html_url'], - 'version' => $release['tag_name'], - 'body' => ParsedownExtra::instance()->text($release['body']) - ]; + $sets[$group][] = array_intersect_key($release, [ + 'prerelease' => null, 'tag_name' => null, 'published_at' => null, 'project' => null + ]) + [ + 'date' => date('Y-m-d', strtotime($release['created_at'])), + //I thought published_at, but GitHub displays created_at and published_at is out of sync sometimes (0.3.2, 0.3.3) + 'name' => $release['name'] ?: $release['tag_name'], + 'url' => $release['html_url'], + 'major_version' => (int)$matches[1], + 'minor_version' => (int)$matches[2], + 'patch_version' => (int)isset($matches[3]) ? $matches[3] : 0, + 'sort_key' => (int)$matches[1] * 1000000 + (int)$matches[2] * 1000 + (int)($matches[3] ?? 0), + 'version' => $matches[1] . '.' . $matches[2] . '.' . (isset($matches[3]) ? $matches[3] : ''), + 'body' => ParsedownExtra::instance()->text($release['body']) + ]; } } - uasort($sets, function ($sA, $sB) { return $sA[0]['created_at'] <=> $sB[0]['created_at']; }); + uasort($sets, function ($sA, $sB) + { + if ($sA[0]['project'] != $sB[0]['project']) + { + return $sA[0]['project'] < $sB[0]['project'] ? -1 : 1; + } + return $sA[0]['sort_key'] < $sB[0]['sort_key'] ? -1 : 1; + }); + foreach ($sets as $group => &$groupSet) { usort($groupSet, function ($rA, $rB) { return $rA['created_at'] <=> $rB['created_at']; }); diff --git a/lib/thirdparty/Mailgun.class.php b/lib/thirdparty/Mailgun.class.php index cef71d83..e9d4de13 100644 --- a/lib/thirdparty/Mailgun.class.php +++ b/lib/thirdparty/Mailgun.class.php @@ -13,7 +13,7 @@ class Mailgun { list($status, $headers, $body) = static::post('/' . static::MAIL_DOMAIN . '/messages', [ 'from' => 'LBRY ', - 'to' => 'jeremy@lbry.io', + 'to' => 'help@lbry.io', 'subject' => 'DMCA Report #' . $data['report_id'], 'html' => '
' . var_export($data, true) . '
', 'o:tracking-clicks' => 'no', diff --git a/view/template/content/roadmap.php b/view/template/content/roadmap.php index 9215a672..d2a07c53 100644 --- a/view/template/content/roadmap.php +++ b/view/template/content/roadmap.php @@ -29,15 +29,15 @@
Show Earlier Releases
$groupItems): ?> - +

"> - +

- + $maxItems): ?> diff --git a/view/template/developer/_quickstartHome.php b/view/template/developer/_quickstartHome.php index 69eb874e..992f1eb6 100644 --- a/view/template/developer/_quickstartHome.php +++ b/view/template/developer/_quickstartHome.php @@ -8,11 +8,7 @@

Begin the Guide diff --git a/view/template/download/_refer.php b/view/template/download/_refer.php index 6bf121d9..2cdf0a65 100644 --- a/view/template/download/_refer.php +++ b/view/template/download/_refer.php @@ -1,5 +1,5 @@

{{title.refer}}

-

{{page.refer.earn1}} {{page.refer.earn2}}

+

{{page.refer.earn1}} '2017-06-19' ? 2.5 : 5)) ?> {{page.refer.earn2}}

diff --git a/web/img/blog-covers/jordan-banner.jpg b/web/img/blog-covers/jordan-banner.jpg new file mode 100644 index 00000000..ca0007cb Binary files /dev/null and b/web/img/blog-covers/jordan-banner.jpg differ diff --git a/web/img/blog-covers/lukehall-banner.jpg b/web/img/blog-covers/lukehall-banner.jpg new file mode 100644 index 00000000..d6aa2c57 Binary files /dev/null and b/web/img/blog-covers/lukehall-banner.jpg differ diff --git a/web/img/news/jordan-inline.jpg b/web/img/news/jordan-inline.jpg new file mode 100644 index 00000000..53e26a41 Binary files /dev/null and b/web/img/news/jordan-inline.jpg differ diff --git a/web/img/news/lukehall-inline.jpg b/web/img/news/lukehall-inline.jpg new file mode 100644 index 00000000..17e05d74 Binary files /dev/null and b/web/img/news/lukehall-inline.jpg differ