new get page, mailchimp integration, staging env, per-os install pages, better flexbox

This commit is contained in:
Jeremy Kauffman 2015-10-29 09:19:53 -04:00
parent 7307427bd9
commit f7eca8c36d
41 changed files with 3528 additions and 548 deletions

View file

@ -18,10 +18,6 @@ class Autoloader
require_once $path;
return true;
}
else
{
throw new InvalidArgumentException('Class "' . $class . '" not found by autoloader');
}
return false;
}

View file

@ -7,101 +7,17 @@
*/
class Actions
{
/**
* @var Session
*/
protected $session;
public function __construct()
{
$this->session = new Session();
}
public function executeHome()
{
return ['page/home', []];
}
public function executeGet()
{
if ($this->validateDownloadAccess())
{
return ['page/get-allowed', []];
}
$inviteError = $this->session->get('invite_error');
$this->session->unsetKey('invite_error');
return ['page/get-denied', ['inviteError' => $inviteError]];
}
public function executePostCommit()
{
$payload = json_decode($_REQUEST['payload'], true);
$rawPost = file_get_contents('php://input');
$secret = trim(file_get_contents($_SERVER['ROOT_DIR'] . '/data/secret/github-secret'));
$this->returnErrorIf(!isset($_SERVER['HTTP_X_HUB_SIGNATURE']), "HTTP header 'X-Hub-Signature' is missing.");
list($algo, $hash) = explode('=', $_SERVER['HTTP_X_HUB_SIGNATURE'], 2) + array('', '');
$this->returnErrorIf(!in_array($algo, hash_algos(), TRUE), 'Invalid hash algorithm "' . $algo . '"');
$this->returnErrorIf($hash !== hash_hmac($algo, $rawPost, $secret), 'Hash does not match. "' . $secret . '"' . ' algo: ' . $algo . '$');
if ($payload['ref'] === 'refs/heads/master')
{
$ret = shell_exec('sudo -u lbry ' . $_SERVER['ROOT_DIR'] . '/update.sh 2>&1');
echo "Successful post commit (aka the script executed, so maybe it is successful):\n";
echo $ret;
}
return [null, []];
}
protected function validateDownloadAccess()
{
$seshionKey = 'has-download-access';
if ($this->session->get($seshionKey))
{
return true;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST')
{
$this->accessCodes = include $_SERVER['ROOT_DIR'] . '/data/secret/access_list.php';
$today = date('Y-m-d H:i:s');
foreach($this->accessCodes as $code => $date)
{
if ($_POST['invite'] == $code && $today <= $date)
{
$this->session->set($seshionKey, true);
Controller::redirect('/get', 302);
}
}
if ($_POST['invite'])
{
$this->session->set('invite_error', 'Please provide a valid invite code.');
}
else
{
$this->session->set('invite_error', 'Please provide an invite code.');
}
Controller::redirect('/get', 401);
}
return false;
}
//this is dumb
protected function returnError($error)
protected static function returnError($error)
{
throw new ErrorException($error);
}
protected function returnErrorIf($condition, $error)
protected static function returnErrorIf($condition, $error)
{
if ($condition)
{
$this->returnError($error);
Actions::returnError($error);
}
}
}

View file

@ -22,7 +22,7 @@ class Controller
{
throw new LogicException('All execute methods must return a template.');
}
echo View::render('layout/basic', [
'content' => View::render($viewTemplate, $viewParameters + ['fullPage' => true])
]);
@ -35,19 +35,19 @@ class Controller
public static function execute($uri)
{
$action = new Actions();
switch($uri)
{
case '/':
return $action->executeHome();
case '/get':
return $action->executeGet();
return ContentActions::executeHome();
case '/postcommit':
return $action->executePostCommit();
return OpsActions::executePostCommit();
case '/list-subscribe':
return MailActions::executeListSubscribe();
default:
if (View::exists('page/' . ltrim($uri, '/')))
$noSlashUri = ltrim($uri, '/');
if (View::exists('page/' . $noSlashUri))
{
return ['page/' . $uri, []];
return ['page/' . $noSlashUri, []];
}
else
{

View file

@ -7,22 +7,22 @@
*/
class Session
{
public function __construct()
public static function init()
{
session_start();
}
public function get($key, $default = null)
public static function get($key, $default = null)
{
return isset($_SESSION[$key]) ? $_SESSION[$key] : $default;
}
public function set($key, $value)
public static function set($key, $value)
{
$_SESSION[$key] = $value;
}
public function unsetKey($key)
public static function unsetKey($key)
{
unset($_SESSION[$key]);
}

View file

@ -0,0 +1,50 @@
<?php
/**
* Description of ContentActions
*
* @author jeremy
*/
class ContentActions extends Actions
{
public static function executeHome()
{
return ['page/home', []];
}
//
// protected static function validateDownloadAccess()
// {
// $seshionKey = 'has-download-access';
// if (Session::get($seshionKey))
// {
// return true;
// }
//
// if ($_SERVER['REQUEST_METHOD'] === 'POST')
// {
// $accessCodes = include $_SERVER['ROOT_DIR'] . '/data/secret/access_list.php';
// $today = date('Y-m-d H:i:s');
// foreach($accessCodes as $code => $date)
// {
// if ($_POST['invite'] == $code && $today <= $date)
// {
// Session::set($seshionKey, true);
// Controller::redirect('/get', 302);
// }
// }
//
// if ($_POST['invite'])
// {
// Session::set('invite_error', 'Please provide a valid invite code.');
// }
// else
// {
// Session::set('invite_error', 'Please provide an invite code.');
// }
//
// Controller::redirect('/get', 401);
// }
//
// return false;
// }
}

View file

@ -0,0 +1,52 @@
<?php
/**
* Description of MailActions
*
* @author jeremy
*/
class MailActions extends Actions
{
public static function executeListSubscribe()
{
if ($_SERVER['REQUEST_METHOD'] !== 'POST')
{
Controller::redirect('/get');
}
$email = $_POST['email'];
if (!$email|| !filter_var($email, FILTER_VALIDATE_EMAIL))
{
Session::set('list_error', $email ? __('Please provide a valid email address.') : __('Please provide an email address.'));
}
elseif (!$_POST['listId'])
{
Session::set('list_error', __('List not provided.'));
}
else
{
$mcApi = new Mailchimp();
if ($mcApi->listSubscribe($_POST['listId'], $email, [], 'html', false))
{
Session::set('list_success', __('Great success! Welcome to LBRY.'));
}
else
{
Session::set('list_error', __('Something went wrong adding you to the list.'));
}
}
Controller::redirect($_POST['return_url'] ?: '/get');
}
public static function prepareJoinList(array $vars)
{
$vars += ['btnClass' => 'btn-primary', 'returnUrl' => $_SERVER['REQUEST_URI']];
$vars['error'] = Session::get('list_error');
$vars['success'] = Session::get('list_success');
Session::unsetKey('list_error');
Session::unsetKey('list_success');
return $vars;
}
}

View file

@ -0,0 +1,27 @@
<?php
/**
* Description of NavActions
*
* @author jeremy
*/
class NavActions extends Actions
{
protected static $navUri;
public static function setNavUri($uri)
{
static::$navUri = $uri;
}
public static function getNavUri()
{
return static::$navUri ?: $_SERVER['REQUEST_URI'];
}
public static function prepareGlobalItems(array $vars)
{
$vars += ['selectedItem' => static::getNavUri()];
return $vars;
}
}

View file

@ -0,0 +1,31 @@
<?php
/**
* Description of OpsActions
*
* @author jeremy
*/
class OpsActions
{
public static function executePostCommit()
{
$payload = json_decode($_REQUEST['payload'], true);
$rawPost = file_get_contents('php://input');
$secret = trim(file_get_contents($_SERVER['ROOT_DIR'] . '/data/secret/github-secret'));
Actions::returnErrorIf(!isset($_SERVER['HTTP_X_HUB_SIGNATURE']), "HTTP header 'X-Hub-Signature' is missing.");
list($algo, $hash) = explode('=', $_SERVER['HTTP_X_HUB_SIGNATURE'], 2) + array('', '');
Actions::returnErrorIf(!in_array($algo, hash_algos(), TRUE), 'Invalid hash algorithm "' . $algo . '"');
Actions::returnErrorIf($hash !== hash_hmac($algo, $rawPost, $secret), 'Hash does not match. "' . $secret . '"' . ' algo: ' . $algo . '$');
if ($payload['ref'] === 'refs/heads/master')
{
$ret = shell_exec('sudo -u lbry ' . $_SERVER['ROOT_DIR'] . '/update.sh 2>&1');
echo "Successful post commit (aka the script executed, so maybe it is successful):\n";
echo $ret;
}
return [null, []];
}
}

23
css Normal file
View file

@ -0,0 +1,23 @@
/*
Errno::ENOENT: No such file or directory - scss
Backtrace:
/var/lib/gems/1.9.1/gems/sass-3.4.11/lib/sass/plugin/compiler.rb:482:in `read'
/var/lib/gems/1.9.1/gems/sass-3.4.11/lib/sass/plugin/compiler.rb:482:in `update_stylesheet'
/var/lib/gems/1.9.1/gems/sass-3.4.11/lib/sass/plugin/compiler.rb:215:in `block in update_stylesheets'
/var/lib/gems/1.9.1/gems/sass-3.4.11/lib/sass/plugin/compiler.rb:209:in `each'
/var/lib/gems/1.9.1/gems/sass-3.4.11/lib/sass/plugin/compiler.rb:209:in `update_stylesheets'
/var/lib/gems/1.9.1/gems/sass-3.4.11/lib/sass/plugin/compiler.rb:293:in `watch'
/var/lib/gems/1.9.1/gems/sass-3.4.11/lib/sass/plugin.rb:108:in `method_missing'
/var/lib/gems/1.9.1/gems/sass-3.4.11/lib/sass/exec/sass_scss.rb:381:in `watch_or_update'
/var/lib/gems/1.9.1/gems/sass-3.4.11/lib/sass/exec/sass_scss.rb:51:in `process_result'
/var/lib/gems/1.9.1/gems/sass-3.4.11/lib/sass/exec/base.rb:52:in `parse'
/var/lib/gems/1.9.1/gems/sass-3.4.11/lib/sass/exec/base.rb:19:in `parse!'
/var/lib/gems/1.9.1/gems/sass-3.4.11/bin/sass:13:in `<top (required)>'
/usr/local/bin/sass:23:in `load'
/usr/local/bin/sass:23:in `<main>'
*/
body:before {
white-space: pre;
font-family: monospace;
content: "Errno::ENOENT: No such file or directory - scss"; }

22
lib/i18n.class.php Normal file
View file

@ -0,0 +1,22 @@
<?php
/**
* i18n dummy we'll be happy to have later
*/
function __($msg)
{
return $msg;
}
/**
* Description of i18n
*
* @author jeremy
*/
class i18n
{
public static function register() /*needed to trigger class include, presumably setup would happen here*/
{
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,76 @@
<?php
class Mailchimp extends MCAPI
{
const LIST_GENERAL_ID = '7b74c90030';
protected static $instance = null;
public function __construct($key = null)
{
if ($key === null)
{
$key = trim(file_get_contents($_SERVER['ROOT_DIR'] . '/data/secret/mailchimp-api-key'));
}
return parent::__construct($key);
}
//
// public function listBatchSubscribeUsers($listId, $persons, Site $site)
// {
// $batch = [];
// foreach($persons as $person)
// {
// $row = $site->isAdmin() ? $this->getMailchimpRowDataAdminSite($person) : $this->getMailchimpRowData($person, $site);
// if ($row)
// {
// $batch[] = $row;
// }
// }
// return $this->listBatchSubscribe($listId, $batch, false, true, false);
// }
//
// protected function getMailchimpRowData($person, $site)
// {
// return [
// 'EMAIL' => $person['email_address'],
// 'FNAME' => $person['first_name'],
// 'LNAME' => $person['last_name'],
// 'GENDER' => $person['gender'],
// 'USER_ID' => $person['id'],
// 'USER_CULTURE' => $person['culture']
// ];
// }
//
// protected function getMailchimpRowDataAdminSite($person)
// {
// if (!preg_match('/@(' . implode('|', SiteDomainTable::getAllServiceDomainNames()) . ')$/', $person['email_address'])) //don't add @network addresses
// {
// $site = SiteTable::guessMostUsedSiteForPersonId($person['id']);
// if (!$site)
// {
// return null;
// }
// $organization = null;
// if ($site->isMultiOrganization())
// {
// $organization = OrganizationTable::guessForNetworkSiteIdAndPersonId($site, $person['id']);
// }
// if (!$organization)
// {
// $organization = $site->Organization;
// }
// return $this->getMailchimpRowData($person, $site) + [
// 'ORG_FULL' => $organization->full_name,
// 'ABBR' => $organization->abbr,
// 'SITE_NAME' => $site->name,
// 'IS_ADMIN' => isset($site['is_admin']) && $site['is_admin'] ? 'Yes' : 'No',
// 'URL' => $site->getPrimaryDomain()->getName(),
// 'STATUS' => $site->is_public ? 'Public' : 'Private',
// 'SERVICE' => $site->Service->name,
// 'CULTURE' => $organization->culture,
// 'USES_PAYMENTS' => PaymentServiceTable::count(['organization_id' => $organization['id'], 'is_enabled' => 1, 'type' => PaymentService::TYPE_TOPSCORE]) ? 'Yes' : 'No'
// ];
// }
// return false;
// }
}

72
view/Response.class.php Normal file
View file

@ -0,0 +1,72 @@
<?php
/**
* Description of Response
*
* @author jeremy
*/
class Response
{
protected static $metaDescription = '',
$metaTitle = '',
// $bodyCssClasses = [],
$metaImg = '';
public static function setMetaDescription($description)
{
static::$metaDescription = $description;
}
public static function setMetaImage($url)
{
static::$metaImg = $url;
}
public static function getMetaDescription()
{
return static::$metaDescription ?: 'A Content Revolution';
}
public static function getMetaImage()
{
return static::$metaImg ?: 'https://lbry.io/img/lbry-dark-1600x528.png';
}
public static function setMetaTitle($title)
{
static::$metaTitle = $title;
}
public static function getMetaTitle()
{
return static::$metaTitle;
}
public static function guessMetaTitle($content)
{
$title = '';
preg_match_all('/<h(1|2)>([^<]+)</', $content, $titleMatches);
foreach($titleMatches[1] as $matchIndex => $headerValue)
{
if ($headerValue == '1' || !$title)
{
$title = $titleMatches[2][$matchIndex];
if ($headerValue == '1')
{
return $title;
}
}
}
return $title;
}
// public static function addBodyCssClass($classOrClasses)
// {
// static::$bodyCssClasses = array_unique(array_merge(static::$bodyCssClasses, (array)$classOrClasses));
// }
//
// public static function getBodyCssClasses()
// {
// return static::$bodyCssClasses;
// }
}

View file

@ -12,11 +12,21 @@ class View
public static function render($template, array $vars = [])
{
if (!static::exists($template))
if (!static::exists($template) || substr_count($template, '/') !== 1)
{
throw new InvalidArgumentException(sprintf('The template "%s" does not exist or is unreadable.', $template));
}
list($module, $view) = explode('/', $template);
$actionClass = ucfirst($module) . 'Actions';
$method = 'prepare' . ucfirst($view);
if (method_exists($actionClass, $method))
{
$vars = $actionClass::$method($vars);
}
extract($vars);
ob_start();
ob_implicit_flush(0);

4
view/get/alphaNotice.php Normal file
View file

@ -0,0 +1,4 @@
<div class="notice notice-info spacer1">
<strong>This is a pre-release, alpha version of LBRY.</strong> It is only designed to show what LBRY makes possible.
Future releases will involve a full network reboot.
</div>

22
view/get/feedback.php Normal file
View file

@ -0,0 +1,22 @@
<div class="cover cover-dark cover-dark-grad content content-dark">
<h1>Test and Earn</h1>
<p>
Regardless of whether you got LBRY to run or not, your feedback is immensely valuable.
Everyone who made <em>any</em> effort to install and complete the survey below will receive 1,000 LBC*.
</p>
<div class="meta">
*What is this worth? Who knows! But it will be the largest reward we will <strong>ever</strong> offer to early adopters. Alternatively, if you complete our survey we will pay you in hugs.
</div>
<h3>Test Your Install</h3>
<ol>
<li>Run <code>lbrynet-console</code> from the command line</li>
<li>Enter <code>get wonderfullife</code></li>
<li>Continue to play as you desire</li>
</ol>
<h3>Feedback</h3>
<p>
Everyone who completes our brief feedback survey will receive 1,000 LBC and your feedback will be personally read by the developers.
Completing this survey also helps signal interest in LBRY to investors.
</p>
<a href="https://docs.google.com/forms/d/1zqa5jBYQMmrZO1utoF2Ok9ka-gXzXLDZKXNNoprufC8/viewform" class="btn-alt">Provide Your Feedback</a>
</div>

15
view/get/get-shared.php Normal file
View file

@ -0,0 +1,15 @@
<?php NavActions::setNavUri('/get') ?>
<?php echo View::render('nav/header', ['isDark' => false]) ?>
<main class="column-fluid">
<div class="span6">
<div class="cover cover-light content">
<?php echo $installHtml ?>
</div>
</div>
<div class="span6">
<?php echo View::render('get/feedback') ?>
</div>
</main>
<?php echo View::render('nav/footer') ?>

View file

@ -4,13 +4,7 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<?php preg_match_all('/<h(1|2)>([^<]+)</', $content, $titleMatches) ?>
<?php $title = null ?>
<?php foreach($titleMatches[1] as $matchIndex => $headerValue): ?>
<?php if ($headerValue == '1' || !$title): ?>
<?php $title = $titleMatches[2][$matchIndex] ?>
<?php endif ?>
<?php endforeach ?>
<?php $title = Response::getMetaTitle() ?: Response::guessMetaTitle($content) ?>
<?php $title = $title ?
$title . (strpos($title, 'LBRY') === false ? ' - LBRY' : '') :
'LBRY' ?>
@ -39,25 +33,27 @@
<!-- Open Graph data -->
<meta property="og:title" content="<?php echo $title ?>" />
<meta property="og:type" content="article" />
<meta property="og:image" content="<?php echo View::getMetaImage() ?>" />
<meta property="og:description" content="<?php echo View::getMetaDescription() ?>"/>
<meta property="og:image" content="<?php echo Response::getMetaImage() ?>" />
<meta property="og:description" content="<?php echo Response::getMetaDescription() ?>"/>
<meta property="og:site_name" content="LBRY" />
</head>
<body <?php echo defined('FOOTER_RENDERED') && FOOTER_RENDERED ? 'class="with-footer"' : '' ?>>
<body>
<?php echo $content ?>
<div id="js">
<script src="/js/jquery-2.1.3.min.js"></script>
<script src="/js/global.js"></script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
<div class="hide">
<div id="js">
<script src="/js/jquery-2.1.3.min.js"></script>
<script src="/js/global.js"></script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-60403362-1', 'auto');
ga('send', 'pageview');
ga('create', 'UA-60403362-1', 'auto');
ga('send', 'pageview');
</script>
</script>
</div>
</div>
</body>
</html>

View file

@ -1,11 +0,0 @@
<form action="//lbry.us9.list-manage.com/subscribe/post?u=6dff893a9da0ab62d6704afc9&amp;id=7b74c90030" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate mailchimp-form" target="_blank" novalidate>
<div class="mail-submit">
<input type="email" value="" name="EMAIL" class="required email standard" id="mce-EMAIL" placeholder="someone@somewhere.com">
<input type="submit" value="<?php echo isset($submitLabel) ? $submitLabel : 'Subscribe' ?>" name="subscribe" id="mc-embedded-subscribe" class="btn-primary">
</div>
<div id="mce-responses" class="clear">
<div class="notice notice-error " id="mce-error-response" style="display:none"></div>
<div class="notice notice-success" id="mce-success-response" style="display:none"></div>
</div> <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
<div style="position: absolute; left: -5000px;"><input type="text" name="b_6dff893a9da0ab62d6704afc9_7b74c90030" tabindex="-1" value=""></div>
</form>

13
view/mail/joinList.php Normal file
View file

@ -0,0 +1,13 @@
<form action="/list-subscribe" method="post" novalidate>
<?php if ($error): ?>
<div class="notice notice-error spacer1"><?php echo $error ?></div>
<?php elseif ($success): ?>
<div class="notice notice-success spacer1"><?php echo $success ?></div>
<?php endif ?>
<div class="mail-submit">
<input type="hidden" name="returnUrl" value="<?php echo $returnUrl ?>"/>
<input type="hidden" name="listId" value="<?php echo $listId ?>"/>
<input type="email" value="" name="email" class="required email standard" placeholder="someone@somewhere.com">
<input type="submit" value="<?php echo isset($submitLabel) ? $submitLabel : 'Subscribe' ?>" name="subscribe" id="mc-embedded-subscribe" class="<?php echo $btnClass ?>">
</div>
</form>

View file

@ -1,21 +1,21 @@
<div class="control-item">
<a href="/get" <?php echo $_SERVER['REQUEST_URI'] === '/get' ? 'class="nav-active"' : ''?>>Get</a>
<a href="/get" <?php echo $selectedItem === '/get' ? 'class="nav-active"' : ''?>>Get</a>
</div>
<div class="control-item">
<a href="/what" <?php echo $_SERVER['REQUEST_URI'] === '/what' ? 'class="nav-active"' : ''?>>What</a>
<a href="/what" <?php echo $selectedItem === '/what' ? 'class="nav-active"' : ''?>>What</a>
</div>
<div class="control-item">
<a href="/why" <?php echo $_SERVER['REQUEST_URI'] === '/why' ? 'class="nav-active"' : ''?>>Why</a>
<a href="/why" <?php echo $selectedItem === '/why' ? 'class="nav-active"' : ''?>>Why</a>
</div>
<div class="control-item">
<a href="//blog.lbry.io">News</a>
</div>
<div class="control-item">
<a href="/team" <?php echo $_SERVER['REQUEST_URI'] === '/team' ? 'class="nav-active"' : ''?>>Team</a>
<a href="/team" <?php echo $selectedItem === '/team' ? 'class="nav-active"' : ''?>>Team</a>
</div>
<div class="control-item no-label">
<a href="http://twitter.com/lbry_io"><span class="icon icon-twitter"></span><span class="btn-label">Twitter</span></a>
</div>
<div class="control-item no-label">
<a href="https://www.facebook.com/pages/LBRY/1459178271065605"><span class="icon icon-facebook"></span> <span class="btn-label">Facebook</span></a>
<a href="https://www.facebook.com/lbryio"><span class="icon icon-facebook"></span> <span class="btn-label">Facebook</span></a>
</div>

View file

@ -1,5 +1,7 @@
<?php echo View::render('nav/header', ['isDark' => false]) ?>
<div class="content">
<h1>Page Not Found</h1>
<p>One day this will be funnier but today is not that day.</p>
</div>
<main>
<div class="content">
<h1>Page Not Found</h1>
<p>One day this will be funnier but today is not that day.</p>
</div>
</main>

71
view/page/cli.php Normal file
View file

@ -0,0 +1,71 @@
<?php Response::setMetaDescription('Download or install the latest version of LBRY.') ?>
<?php echo View::render('nav/header', ['isDark' => false]) ?>
<main>
<div class="content spacer1">
<h1>LBRY for CLI</h1>
<div class="notice notice-info">
<strong>This is a pre-release, alpha version of LBRY.</strong> It is only designed to show what LBRY makes possible.
Expect future releases to involve a full network reboot of both credits and metadata.
</div>
</div>
<div class="content">
<h2>Install</h2>
<div class="row-fluid">
<div class="span6">
<h3><span class="icon-linux"></span> Linux</h3>
<div>
<h4>The Brave and Lazy</h4>
<ol>
<li>Make a folder called <code>lbry</code> where you want everything to reside.</li>
<li>Download and run <a href="https://raw.githubusercontent.com/lbryio/lbry-setup/master/lbry_setup.sh" class="link-primary">this shell script</a> from that folder.</li>
</ol>
<h4>The Shrewd and Frivolous</h4>
<ol>
<li>Clone and follow the build steps for <a href="https://github.com/lbryio/lbrycrd" class="link-primary">lbrycrd</a>, a miner for LBRY credits.</li>
<li>Clone and follow the build steps for <a href="https://github.com/lbryio/lbry" class="link-primary">lbry</a>, a console based application for using the LBRY protocol.</li>
</ol>
</div>
</div>
<div class="span6">
<h3><span class="icon-apple"></span> OS X</h3>
<div>
<h4>OS X Programmers</h4>
<p>You can attempt to follow the Linux build instructions.</p>
<h4>Everyone Else</h4>
<p>Sorry, we do not have an OS X version of LBRY other than source. We promise one will exist sooner rather than later.</p>
</div>
</div>
</div>
<h2>Test</h2>
<p>To ensure LBRY is installed co:</p>
<div class="text-center spacer1">
<code>get wonderfullife</code>
</div>
<p class="meta">In the graphical version, this can accessed by typing "wonderfullife" into the address bar and pressing "Go". In the console version, select "[7] Add a stream from a short name".</p>
<div class="spacer2">
<h2>Feedback</h2>
<p>We've prepared a short form for feedback regarding your LBRY experience, available below.</p>
<p>We're providing 10,000 LBC (~$100) to the first 500 people who download LBRY and submit their feedback.</p>
<p><a href="https://docs.google.com/forms/d/1zqa5jBYQMmrZO1utoF2Ok9ka-gXzXLDZKXNNoprufC8/viewform" class="btn-primary">Provide Your Feedback</a></p>
</div>
</div>
</main>
<?php echo View::render('nav/footer') ?>
<?php /*
*
* <div class="span4">
<h3><span class="icon-windows"></span> Windows</h3>
<p class="meta">
If you have a standard Windows install, it will insinuate several times that you are an idiot for following the steps below.
And perhaps you are, but not because this code is dangerous or will harm your computer in any way. Future releases will involve more reputable install steps.
</p>
<ol>
<li>Download <a href="https://github.com/lbryio/lbry/releases/download/alpha/lbry-windows.zip" class="link-primary">this ZIP</a> file.</li>
<li>There is no installer. Extract the ZIP to wherever you want the program to reside, such as <code>Program Files</code>.</li>
<li>Run lbry.exe.</li>
</ol>
</div>
*/

View file

@ -1,5 +1,6 @@
<?php View::setMetaDescription('Download or install the latest version of LBRY.') ?>
<?php Response::setMetaDescription('Download or install the latest version of LBRY.') ?>
<?php echo View::render('nav/header', ['isDark' => false]) ?>
<?php throw new Exception('not used atm') ?>
<div class="content spacer1">
<h1>Get LBRY</h1>
<div class="notice notice-info">

View file

@ -1,41 +0,0 @@
<?php View::setMetaDescription('Download or install the latest version of LBRY.') ?>
<?php echo View::render('nav/header', ['isDark' => false]) ?>
<div class="content spacer1">
<h1>Get LBRY</h1>
</div>
<div class="hero hero-pattern spacer2">
<div class="hero-content content content-dark">
<h2 class="hero-title text-center">LBRY is temporarily invite-only.</h2>
<div class="row-fluid">
<div class="span6">
<h3 class="hero-title-small">I Have An Invite Code</h3>
<p>Enter your code below.</p>
<?php if ($inviteError): ?>
<div class="notice notice-error spacer1"><?php echo $inviteError ?></div>
<?php endif ?>
<form action="/get" method="post" novalidate>
<div class="mail-submit">
<input type="text" value="" name="invite" placeholder="BANANA">
<input type="submit" value="Go" name="submit" class="btn-alt">
</div>
</form>
</div>
<div class="span6">
<h3 class="hero-title-small">Tell Me When LBRY Is Public</h3>
<p>LBRY is launching soon. Be the first to know.</p>
<?php echo View::render('mail/joinGeneralList', [
'submitLabel' => 'Subscribe'
]) ?>
</div>
</div>
</div>
</div>
<?php if ($fullPage): ?>
<div class="content">
<h3>Want To Know More?</h3>
<p>Learn about <a href="/what" class="link-primary">what LBRY does</a>,
<a href="/why" class="link-primary">why we made it</a>, or
<a href="//blog.lbry.io" class="link-primary">read the latest news</a>.</p>
</div>
<?php endif ?>
<?php echo View::render('nav/footer') ?>

39
view/page/get.php Normal file
View file

@ -0,0 +1,39 @@
<?php Response::setMetaDescription('Download or install the latest version of LBRY.') ?>
<?php Response::setMetaTitle(__('Get LBRY')) ?>
<?php echo View::render('nav/header', ['isDark' => false]) ?>
<main class="column-fluid">
<div class="span6">
<div class="cover cover-dark cover-dark-grad content content-dark">
<div class="meta meta-large">
<span class="icon-mobile"></span> <span class="icon-windows"></span> <span class="icon-android"></span>
</div>
<h1><?php echo __('I want LBRY for mobile, Windows, or shudder at the phrase "command line".') ?></h1>
<p class="pflow">LBRY is coming out on your favorite platform soon. Join our list to know when.</p>
<?php echo View::render('mail/joinList', [
'submitLabel' => 'Go',
'listId' => Mailchimp::LIST_GENERAL_ID,
'btnClass' => 'btn-alt'
]) ?>
</div>
</div>
<div class="span6">
<div class="cover cover-light content">
<div class="meta meta-large">
<span class="icon-linux"></span> <span class="icon-apple"></span>
</div>
<h1><?php echo __('I am a Linux or OSX user comfortable from the command line.') ?></h1>
<p class="pflow">Earn early adopter rewards and interact directly with developers via our Alpha client.</p>
<div class="content-inset">
<ul class="no-style">
<li>
<a href="/linux" class="link-primary"><span class="icon-linux"></span> Linux</a>
</li>
<li>
<a href="/osx" class="link-primary"><span class="icon-apple"></span> OSX</a>
</li>
</ul>
</div>
</div>
</div>
</main>
<?php echo View::render('nav/footer') ?>

View file

@ -1,16 +1,18 @@
<div class="bg-image-full" style="background-image: url(/img/cover-home2.jpg)"></div>
<div class="cover-and-header">
<?php echo View::render('nav/header', ['isDark' => true]) ?>
<div class="cover cover-dark" >
<div class="cover-content">
<?php echo View::render('nav/header', ['isDark' => true]) ?>
<main class="column-fluid">
<div class="span12">
<div class="cover cover-dark cover-center">
<h2 class="cover-title">Watch, Share, Earn.</h2>
<h3 class="cover-subtitle">Join a fully distributed network that makes information open to everyone.</h3>
<div class="control-group spacer1">
<div class="control-item">
<a href="/get" class="btn-primary">Get LBRY</a>
</div>
<div class="control-item">
<a href="/what" class="btn-alt">Learn More</a>
<div class="text-center">
<h3 class="cover-subtitle">Join a fully distributed network that makes information open to everyone.</h3>
<div class="control-group spacer1">
<div class="control-item">
<a href="/get" class="btn-primary">Get LBRY</a>
</div>
<div class="control-item">
<a href="/what" class="btn-alt">Learn More</a>
</div>
</div>
</div>
<div class="video">
@ -18,4 +20,4 @@
</div>
</div>
</div>
</div>
</main>

23
view/page/linux.php Normal file
View file

@ -0,0 +1,23 @@
<?php Response::setMetaDescription('Download/install the latest version of LBRY for Linux.') ?>
<?php ob_start() ?>
<h1>Install LBRY on Linux <span class="icon-linux"></span></h1>
<?php echo View::render('get/alphaNotice') ?>
<div class="meta spacer1 text-center">Choose an install option.</div>
<div class="row-fluid">
<div class="span6">
<h3>For the Efficient and Lazy</h3>
<ol>
<li>Make a folder called <code>lbry</code> where you want everything to reside.</li>
<li>Download and run <a href="https://raw.githubusercontent.com/lbryio/lbry-setup/master/lbry_setup.sh" class="link-primary">this script</a> from that folder.</li>
</ol>
</div>
<div class="span6">
<h3>For the Shrewd and Frivolous</h3>
<ol>
<li>Clone and follow the build steps for <a href="https://github.com/lbryio/lbrycrd" class="link-primary">lbrycrd</a>, a miner for LBRY credits.</li>
<li>Clone and follow the build steps for <a href="https://github.com/lbryio/lbry" class="link-primary">lbry</a>, a console based application for using the LBRY protocol.</li>
</ol>
</div>
</div>
<?php $html = ob_get_clean() ?>
<?php echo View::render('get/get-shared', ['installHtml' => $html]) ?>

23
view/page/osx.php Normal file
View file

@ -0,0 +1,23 @@
<?php Response::setMetaDescription('Download/install the latest version of LBRY for OSX.') ?>
<?php ob_start() ?>
<h1>Install LBRY on OSX <span class="icon-apple"></span> (command line)</h1>
<?php echo View::render('get/alphaNotice') ?>
<div class="meta spacer1 text-center">Choose an install option.</div>
<div class="row-fluid">
<div class="span6">
<h3>For the Efficient and Lazy</h3>
<ol>
<li>Make a folder called <code>lbry</code> where you want everything to reside.</li>
<li>Download and run <a href="https://raw.githubusercontent.com/lbryio/lbry-setup/master/lbry_setup.sh" class="link-primary">this script</a> from that folder.</li>
</ol>
</div>
<div class="span6">
<h3>For the Shrewd and Frivolous</h3>
<ol>
<li>Clone and follow the build steps for <a href="https://github.com/lbryio/lbrycrd" class="link-primary">lbrycrd</a>, a miner for LBRY credits.</li>
<li>Clone and follow the build steps for <a href="https://github.com/lbryio/lbry" class="link-primary">lbry</a>, a console based application for using the LBRY protocol.</li>
</ol>
</div>
</div>
<?php $html = ob_get_clean() ?>
<?php echo View::render('get/get-shared', ['installHtml' => $html]) ?>

View file

@ -1,98 +1,102 @@
<?php View::setMetaImage('http://lbry.io/img/cover-team.jpg') ?>
<?php View::setMetaDescription('LBRY is founded by a team passionate about connecting producers and consumers and breaking down broken models. Learn more about them.') ?>
<?php echo View::render('nav/header', ['isDark' => false]) ?>
<div class="content">
<h1>About Us</h1>
</div>
<div class="hero hero-quote hero-img spacer2" style="background-image: url(/img/cover-team.jpg)">
<div class="hero-content-wrapper">
<div class="hero-content">
<blockquote class="blockquote-large">
<p>Working with LBRY is a chance to align philosophy and profit.</p>
</blockquote>
<cite>Mike Vine <em>Technology Evangelist</em></cite>
</div>
</div>
</div>
<div class="content photo-grid spacer2">
<h2>The Team</h2>
<div class="row-fluid">
<div class="span6 spacer2">
<div class="photo-container">
<img src="/img/jeremy-644x450.jpg" alt="photo of Jeremy"/>
</div>
<h4>Jeremy Kauffman <a href="mailto:jeremy@lbry.io" class="link-primary"><span class="icon icon-envelope"></span></a></h4>
<div class="meta spacer1">Founder, Director</div>
<p>
Because graduating from RPI with degrees in physics and computer science is the hip thing to do, Jeremy did the same. Jeremy is also the founder and CEO of <a href="//usetopscore.com" class="link-primary">TopScore</a>, a startup that processes millions of dollars monthly in event and activity registrations.
</p>
<p>
Jeremy has been responsible for the packing, presentation, and strategy of LBRY, as well as some design aspects. Jeremy is a longtime BitTorrent community enthusiast.
</p>
</div>
<div class="span6 spacer2">
<div class="photo-container">
<img src="/img/jimmy-644x450.jpg" alt="photo of jimmy"/>
</div>
<h4>
Jimmy Kiselak
<a href="mailto:jimmy@lbry.io" class="link-primary"><span class="icon icon-envelope"></span></a>
</h4>
<div class="meta spacer1">Founder, Developer</div>
<p>
After graduating from RPI with a degree in physics and computer science, Jimmy found himself mired in government bureaucracy, spending too much time to get too little done. Jimmy has been a Bitcoin fanatic since its early days as well as long been interested in the benefits of decentralization.
</p>
<p>
Ready to work on a project he believed in, Jimmy quit his national security job to start LBRY several months ago. Jimmy created the LBRY protocol and the first LBRY application.
</p>
</div>
</div>
<div class="row-fluid">
<div class="span6 spacer2">
<div class="photo-container">
<img src="/img/mike-644x450.jpg" alt="photo of Mike"/>
</div>
<h4>Mike Vine <a href="mailto:mike@lbry.io" class="link-primary"><span class="icon icon-envelope"></span></a></h4>
<div class="meta spacer1">Technology Evangelist</div>
<p>
With a humble BA in Philosophy from Tulane University, Mike has built a successful financial services marketing company, Centinel Consulting. Centinel recently built a clients website from 20K visitors per month to 150K, and manages email marketing lists and social media accounts with hundreds of thousands of followers.
</p>
<p>
Mike has been involved with the Bitcoin community since the early days. His friends have launched companies like Lamassu BTM, Coinapult, and Shapeshift. Now, he wants a turn to help change the world by harnessing blockchain technology. Mike heads up LBRYs marketing efforts and serves as an ambassador for our platform to media, investors, and the public.
</p>
</div>
<div class="span6 spacer2">
<div class="photo-container">
<img src="/img/brandon-644x450.jpg" alt="Photo of Brandon"/>
</div>
<h4>Brandon Ross <a href="mailto:contact@bdrosslaw.com" class="link-primary"><span class="icon icon-envelope"></span></a></h4>
<div class="meta spacer1">Legal, Advisor</div>
<p>
Brandon is the founder of <a href="//bdrosslaw.com" class="link-primary">B.D. Ross Law</a>, a law firm focusing on IP concerns. He holds degrees in math, economics, engineering, and law. Brandon regularly tells Jeremy and Jimmy that he had this idea years ago.
</p>
</div>
</div>
<div class="row-fluid">
<div class="span3"></div>
<div class="span6">
<img src="/img/spooner-644x450.jpg" alt="photo of you!"/>
<h4>You</h4>
<div class="meta spacer1">Developer, Designer, Economist, Marketer, Investor, ???</div>
<p>
Do you think opening up information would facilitate human flourishing?
Do you want to join a bright core of people with an obsession for upending broken systems?
<a href="mailto:jeremy@lbry.io" class="link-primary">Say hello.</a>
<?php Response::setMetaImage('http://lbry.io/img/cover-team.jpg') ?>
<?php Response::setMetaDescription('LBRY is founded by a team passionate about connecting producers and consumers and breaking down broken models. Learn more about them.') ?>
</p>
<?php echo View::render('nav/header', ['isDark' => false]) ?>
<main>
<div class="content">
<h1>About Us</h1>
</div>
<div class="hero hero-quote hero-img spacer2" style="background-image: url(/img/cover-team.jpg)">
<div class="hero-content-wrapper">
<div class="hero-content">
<blockquote class="blockquote-large">
<p>Working with LBRY is a chance to align philosophy and profit.</p>
</blockquote>
<cite>Mike Vine <em>Technology Evangelist</em></cite>
</div>
</div>
</div>
</div>
<div class="content text-center spacer2">
<h3>Not Ready to Get Serious?</h3>
<p>Join our mailing list for updates about LBRY.</p>
<?php echo View::render('mail/joinGeneralList', [
'submitLabel' => 'Subscribe'
]) ?>
</div>
<div class="content photo-grid spacer2">
<h2>The Team</h2>
<div class="row-fluid">
<div class="span6 spacer2">
<div class="photo-container">
<img src="/img/jeremy-644x450.jpg" alt="photo of Jeremy"/>
</div>
<h4>Jeremy Kauffman <a href="mailto:jeremy@lbry.io" class="link-primary"><span class="icon icon-envelope"></span></a></h4>
<div class="meta spacer1">Founder, Director</div>
<p>
Because graduating from RPI with degrees in physics and computer science is the hip thing to do, Jeremy did the same. Jeremy is also the founder and CEO of <a href="//usetopscore.com" class="link-primary">TopScore</a>, a startup that processes millions of dollars monthly in event and activity registrations.
</p>
<p>
Jeremy has been responsible for the packing, presentation, and strategy of LBRY, as well as some design aspects. Jeremy is a longtime BitTorrent community enthusiast.
</p>
</div>
<div class="span6 spacer2">
<div class="photo-container">
<img src="/img/jimmy-644x450.jpg" alt="photo of jimmy"/>
</div>
<h4>
Jimmy Kiselak
<a href="mailto:jimmy@lbry.io" class="link-primary"><span class="icon icon-envelope"></span></a>
</h4>
<div class="meta spacer1">Founder, Developer</div>
<p>
After graduating from RPI with a degree in physics and computer science, Jimmy found himself mired in government bureaucracy, spending too much time to get too little done. Jimmy has been a Bitcoin fanatic since its early days as well as long been interested in the benefits of decentralization.
</p>
<p>
Ready to work on a project he believed in, Jimmy quit his national security job to start LBRY several months ago. Jimmy created the LBRY protocol and the first LBRY application.
</p>
</div>
</div>
<div class="row-fluid">
<div class="span6 spacer2">
<div class="photo-container">
<img src="/img/mike-644x450.jpg" alt="photo of Mike"/>
</div>
<h4>Mike Vine <a href="mailto:mike@lbry.io" class="link-primary"><span class="icon icon-envelope"></span></a></h4>
<div class="meta spacer1">Technology Evangelist</div>
<p>
With a humble BA in Philosophy from Tulane University, Mike has built a successful financial services marketing company, Centinel Consulting. Centinel recently built a clients website from 20K visitors per month to 150K, and manages email marketing lists and social media accounts with hundreds of thousands of followers.
</p>
<p>
Mike has been involved with the Bitcoin community since the early days. His friends have launched companies like Lamassu BTM, Coinapult, and Shapeshift. Now, he wants a turn to help change the world by harnessing blockchain technology. Mike heads up LBRYs marketing efforts and serves as an ambassador for our platform to media, investors, and the public.
</p>
</div>
<div class="span6 spacer2">
<div class="photo-container">
<img src="/img/brandon-644x450.jpg" alt="Photo of Brandon"/>
</div>
<h4>Brandon Ross <a href="mailto:contact@bdrosslaw.com" class="link-primary"><span class="icon icon-envelope"></span></a></h4>
<div class="meta spacer1">Legal, Advisor</div>
<p>
Brandon is the founder of <a href="//bdrosslaw.com" class="link-primary">B.D. Ross Law</a>, a law firm focusing on IP concerns. He holds degrees in math, economics, engineering, and law. Brandon regularly tells Jeremy and Jimmy that he had this idea years ago.
</p>
</div>
</div>
<div class="row-fluid">
<div class="span3"></div>
<div class="span6">
<img src="/img/spooner-644x450.jpg" alt="photo of you!"/>
<h4>You</h4>
<div class="meta spacer1">Developer, Designer, Economist, Marketer, Investor, ???</div>
<p>
Do you think opening up information would facilitate human flourishing?
Do you want to join a bright core of people with an obsession for upending broken systems?
<a href="mailto:jeremy@lbry.io" class="link-primary">Say hello.</a>
</p>
</div>
</div>
</div>
<div class="content text-center spacer2">
<h3>Not Ready to Get Serious?</h3>
<p>Join our mailing list for updates about LBRY.</p>
<?php echo View::render('mail/joinList', [
'submitLabel' => 'Subscribe',
'listId' => Mailchimp::LIST_GENERAL_ID
]) ?>
</div>
</main>
<?php echo View::render('nav/footer') ?>

View file

@ -1,103 +1,106 @@
<?php View::setMetaDescription('Access information and content in ways you never dreamed possible. Earn credits for your unused bandwidth and diskspace.') ?>
<?php Response::setMetaDescription('Access information and content in ways you never dreamed possible. Earn credits for your unused bandwidth and diskspace.') ?>
<?php echo View::render('nav/header', ['isDark' => false]) ?>
<div class="content">
<h1>What is LBRY?</h1>
</div>
<div class="hero hero-pattern spacer2">
<div class="hero-content text-center">
<h2 class="hero-title">A revolution in accessing and publishing information.</h2>
<div class="row-fluid hero-tile-row">
<div class="span4 hero-tile">
<div class="spacer1">
<span class="icon-money icon-mega"></span>
<main>
<div class="content">
<h1>What is LBRY?</h1>
</div>
<div class="hero hero-pattern spacer2">
<div class="hero-content text-center">
<h2 class="hero-title">A revolution in accessing and publishing information.</h2>
<div class="row-fluid hero-tile-row">
<div class="span4 hero-tile">
<div class="spacer1">
<span class="icon-money icon-mega"></span>
</div>
<h4>
<strong>Hosts</strong> earn credits for providing bandwidth and disk space.
</h4>
</div>
<h4>
<strong>Hosts</strong> earn credits for providing bandwidth and disk space.
</h4>
</div>
<div class="span4 hero-tile">
<div class="spacer1">
<span class="icon-mega icon-gears"></span>
<div class="span4 hero-tile">
<div class="spacer1">
<span class="icon-mega icon-gears"></span>
</div>
<h4>
<strong>Miners</strong> earn credits for securing balances and metadata.
</h4>
</div>
<h4>
<strong>Miners</strong> earn credits for securing balances and metadata.
</h4>
</div>
<div class="span4 hero-tile">
<div class="spacer1">
<span class="icon-chain-broken icon-mega"></span>
<div class="span4 hero-tile">
<div class="spacer1">
<span class="icon-chain-broken icon-mega"></span>
</div>
<h4>
<strong>Patrons</strong> spend credits to access content without gatekeepers.
</h4>
</div>
<h4>
<strong>Patrons</strong> spend credits to access content without gatekeepers.
</h4>
</div>
</div>
</div>
</div>
<div class="content">
<div class="spacer2">
<h3>Tell Me More</h3>
<p>LBRY allows anyone to publish content to a location like this:</p>
<p class="text-center"><code>lbry://wonderfullife</code></p>
<p>Others can access this resource, either for free or for credits. Let's look at an example:</p>
<ol>
<li>Ernest wants to release his comedy-horror film, "Ernie Goes To Guantanamo Bay".</li>
<li>The content is encrypted and sliced into many pieces. These pieces are stored by <strong>hosts</strong>.</li>
<li>Ernest reserves <code>lbry://erniebythebay</code>, a shortname pointing to his content.</li>
<li>When Ernest reserves the location, he also submits metadata, such as a description and thumbnail. This information is stored by <strong>miners</strong> in the LBRY blockchain.</li>
<li>Hilary, a <strong>patron</strong>, browses the LBRY network and wants to watch the movie.
Her LBRY client collects the pieces from the <strong>hosts</strong> and reassembles them.</li>
<li>Hilary pays Ernest for the decryption key, allowing her to watch the film.</li>
</ol>
</div>
</div>
<div class="hero hero-pattern spacer2">
<div class="hero-content">
<h2 class="text-center hero-title">If BitTorrent + BitCoin Had a Baby</h2>
<div class="row-fluid hero-tile-row">
<div class="span4 hero-tile">
<span class="icon-mega icon-cloud"></span>
<h3>Decentralized Metadata</h3>
<p>Information about content is embedded in a blockchain, eliminating centralized failure points. Metadata and data are completely decoupled so that <strong>hosts</strong> never see metadata and <strong>miners</strong> never see data.</p>
</div>
<div class="span4 hero-tile">
<span class="icon-mega icon-shopping-cart"></span>
<h3>Marketized Data-Transfer</h3>
<p><strong>Patrons</strong> request content for free or offer credits for faster speeds or access. <strong>Hosts</strong> share or sell surplus bandwidth and disk space.</p>
</div>
<div class="span4 hero-tile">
<span class="icon-mega icon-link"></span>
<h3>Memorable URIs</h3>
<p>
<strong>Publishers</strong> can choose friendly resource indicators like <code>lbry://wonderfullife</code> instead of ugly BitTorrent magnet URIs.
URIs are <em>reserved</em> rather than owned, creating strong incentive for rights holders to use LBRY.
</p>
</div>
<div class="content">
<div class="spacer2">
<h3>Tell Me More</h3>
<p>LBRY allows anyone to publish content to a location like this:</p>
<p class="text-center"><code>lbry://wonderfullife</code></p>
<p>Others can access this resource, either for free or for credits. Let's look at an example:</p>
<ol>
<li>Ernest wants to release his comedy-horror film, "Ernie Goes To Guantanamo Bay".</li>
<li>The content is encrypted and sliced into many pieces. These pieces are stored by <strong>hosts</strong>.</li>
<li>Ernest reserves <code>lbry://erniebythebay</code>, a shortname pointing to his content.</li>
<li>When Ernest reserves the location, he also submits metadata, such as a description and thumbnail. This information is stored by <strong>miners</strong> in the LBRY blockchain.</li>
<li>Hilary, a <strong>patron</strong>, browses the LBRY network and wants to watch the movie.
Her LBRY client collects the pieces from the <strong>hosts</strong> and reassembles them.</li>
<li>Hilary pays Ernest for the decryption key, allowing her to watch the film.</li>
</ol>
</div>
<div class="row-fluid hero-tile-row">
<div class="span4 hero-tile">
<span class="icon-mega icon-usd" style="font-size: 180px"></span>
<h3>Payments to Publishers</h3>
<p><strong>Publishers</strong> may embed an address to receive payment for data. Publishers can also create assurance contracts<sup><a href="//en.wikipedia.org/wiki/Assurance_contract">?</a></sup> for new content.</p>
</div>
<div class="hero hero-pattern spacer2">
<div class="hero-content">
<h2 class="text-center hero-title">If BitTorrent + BitCoin Had a Baby</h2>
<div class="row-fluid hero-tile-row">
<div class="span4 hero-tile">
<span class="icon-mega icon-cloud"></span>
<h3>Decentralized Metadata</h3>
<p>Information about content is embedded in a blockchain, eliminating centralized failure points. Metadata and data are completely decoupled so that <strong>hosts</strong> never see metadata and <strong>miners</strong> never see data.</p>
</div>
<div class="span4 hero-tile">
<span class="icon-mega icon-shopping-cart"></span>
<h3>Marketized Data-Transfer</h3>
<p><strong>Patrons</strong> request content for free or offer credits for faster speeds or access. <strong>Hosts</strong> share or sell surplus bandwidth and disk space.</p>
</div>
<div class="span4 hero-tile">
<span class="icon-mega icon-link"></span>
<h3>Memorable URIs</h3>
<p>
<strong>Publishers</strong> can choose friendly resource indicators like <code>lbry://wonderfullife</code> instead of ugly BitTorrent magnet URIs.
URIs are <em>reserved</em> rather than owned, creating strong incentive for rights holders to use LBRY.
</p>
</div>
</div>
<div class="span4 hero-tile">
<span class="icon-mega icon-lock"></span>
<h3>Improved Privacy</h3>
<p>LBRY uses novel techniques to protect publishers, providers, and consumers.
<strong>Hosts</strong> only have small portions of an encrypted file with no information of the contents.
</p>
</div>
<div class="span4 hero-tile">
<span class="icon-mega icon-code"></span>
<h3>Designed for Developers</h3>
<p>LBRY is designed to allow others to create applications powered by its distributed, robust data store.</p>
<div class="row-fluid hero-tile-row">
<div class="span4 hero-tile">
<span class="icon-mega icon-usd" style="font-size: 180px"></span>
<h3>Payments to Publishers</h3>
<p><strong>Publishers</strong> may embed an address to receive payment for data. Publishers can also create assurance contracts<sup><a href="//en.wikipedia.org/wiki/Assurance_contract">?</a></sup> for new content.</p>
</div>
<div class="span4 hero-tile">
<span class="icon-mega icon-lock"></span>
<h3>Improved Privacy</h3>
<p>LBRY uses novel techniques to protect publishers, providers, and consumers.
<strong>Hosts</strong> only have small portions of an encrypted file with no information of the contents.
</p>
</div>
<div class="span4 hero-tile">
<span class="icon-mega icon-code"></span>
<h3>Designed for Developers</h3>
<p>LBRY is designed to allow others to create applications powered by its distributed, robust data store.</p>
</div>
</div>
</div>
</div>
</div>
<div class="content spacer2">
<h3>How do I use it?</h3>
<p><a href="/get" class="btn-primary">Get LBRY</a></p>
<p>Or, learn more about <a href="/why" class="link-primary">why we've created LBRY</a>.</p>
</div>
<div class="content spacer2">
<h3>How do I use it?</h3>
<p><a href="/get" class="btn-primary">Get LBRY</a></p>
<p>Or, learn more about <a href="/why" class="link-primary">why we've created LBRY</a>.</p>
</div>
</main>
<?php echo View::render('nav/footer') ?>

View file

@ -1,106 +1,108 @@
<?php View::setMetaImage('http://lbry.io/img/xkcd-comic.png') ?>
<?php View::setMetaDescription('Learn about the inspiration behind LBRY\'s revolutionary content distribution system.') ?>
<?php Response::setMetaImage('http://lbry.io/img/xkcd-comic.png') ?>
<?php Response::setMetaDescription('Learn about the inspiration behind LBRY\'s revolutionary content distribution system.') ?>
<?php echo View::render('nav/header', ['isDark' => false]) ?>
<div class="content"><h1>Why?</h1></div>
<div class="hero hero-quote hero-img spacer2" style="background-image: url(/img/cover-jcole.jpg)">
<div class="hero-content-wrapper">
<div class="hero-content">
<blockquote>
<p>If you made the fuckin' music, and you made the art, and you put it into the world, I should be able to use it however the fuck I want. I'ma pay you, I'ma give you a percentage, but you shouldn't be able to tell me I can't use it. You was inspired by the world; allow the world to be inspired by your shit and to use your shit.</p>
</blockquote>
<cite>J. Cole, <em><a href="https://www.youtube.com/watch?v=UMCGOAGb4Y0&amp;t=470s">Note to Self</a></em></cite>
</div>
</div>
</div>
<div class="content spacer2">
<h3>The World We Live In</h3>
<p>Annual internet video traffic is approximately 500 exabytes (500,000,000,000 GB)<sup><a href="http://www.cisco.com/c/en/us/solutions/collateral/service-provider/ip-ngn-ip-next-generation-network/white_paper_c11-481360.html">1</a></sup>.
Every second, over 10,000 hours of video are streamed.
The technical term for the quantity of videos people watch every year is a million jillion. You know this.</p>
<p>What you may not know: <em>video distribution is fundamentally flawed</em>.</p>
<p>
The fatal flaw of existing systems is their centralized, top-down design. The consequences:
</p>
<ol>
<li><p><strong>Increased costs to consumers.</strong> Providers bear significant infrastructure costs, regulatory and compliance costs,
and must create complex systems to govern a simple process (copying a number).</p></li>
<li><p><strong>Terrible consumer experience.</strong>
Centralization leads to fragmentation, as providers compete to lock numbers in digit dungeons.</p>
</li>
<li>
<p><strong>Poor producer experience.</strong>
The primary want of a producer is to be paid for making things. Instead, producers frequently lose control of their content and
lose profits to the inefficiency of current systems.</p>
</li>
</ol>
<p>Similar issues of economics and experience exist for consumers and producers of information of all kinds (e.g. news, facts), not just videos.</p>
<p>LBRY solves these problems and throws in some other sweet innovations just for funsies.</p>
</div>
<div class="hero hero-quote hero-img spacer2" style="background-image: url(/img/cover-swartz.jpg)">
<div class="hero-content-wrapper">
<div class="hero-content">
<blockquote>
<p>Information is power.</p>
<p>But like all power, there are those who want to keep it for themselves.
</blockquote>
<cite>Aaron Swartz</cite>
</div>
</div>
</div>
<div class="content spacer2">
<h3>An Alternative</h3>
<p>LBRY avoids the mistakes of centralization and middlemen. It says:</p>
<ol>
<li>
<p>
<strong>Information isn't a thing</strong>
Things are physical and exist in the world. When I have a thing, you can't. Economists call this <em>rivalry</em><sup><a href="//en.wikipedia.org/wiki/Rivalry_%28economics%29">?</a></sup>.
</p>
<p>
Information is non-rival. Information is just a number. There is nothing easier to replicate than information.
LBRY embraces (and adores) this reality.
</p>
<p>
LBRY breaks information into thousands of identifiable tiny pieces and spreads them throughout the internet, reducing costs
for both providers and consumers.
</p>
<div class="spacer2">
<img src="/img/xkcd-comic.png" alt="XKCD #1228 Prometheus"/>
<div class="meta text-center"><a href="https://xkcd.com/1228/">XKCD #1228</a></div>
<main>
<div class="content"><h1>Why?</h1></div>
<div class="hero hero-quote hero-img spacer2" style="background-image: url(/img/cover-jcole.jpg)">
<div class="hero-content-wrapper">
<div class="hero-content">
<blockquote>
<p>If you made the fuckin' music, and you made the art, and you put it into the world, I should be able to use it however the fuck I want. I'ma pay you, I'ma give you a percentage, but you shouldn't be able to tell me I can't use it. You was inspired by the world; allow the world to be inspired by your shit and to use your shit.</p>
</blockquote>
<cite>J. Cole, <em><a href="https://www.youtube.com/watch?v=UMCGOAGb4Y0&amp;t=470s">Note to Self</a></em></cite>
</div>
</li>
<li>
<p>
<strong>Connecting creators and consumers directly is best.</strong>
Do we need middlemen spending billions to extract their rent and police others?
A better system allows consumers to easily and directly pay content creators.
We want to eliminate extortionists charging tolls.
</p>
<p>
On LBRY, publishers sell directly to patrons. Publishers can charge a set fee per decryption key for content or create an assurance contract for unpublished content.
</p>
</li>
<li>
<p><strong>It's Up to Us.</strong> A smart guy once said that power corrupts and absolutely power corrupts absolutely.</p>
<p>
LBRY leaves no one in charge (including us). It puts power in the hands of individuals and users rather than corporations and executives.
</p>
<p>We think that world will be more creative, more charitable, and more fair. We hope you'll join us in creating it.</p>
</li>
</div>
</div>
<div class="content spacer2">
<h3>The World We Live In</h3>
<p>Annual internet video traffic is approximately 500 exabytes (500,000,000,000 GB)<sup><a href="http://www.cisco.com/c/en/us/solutions/collateral/service-provider/ip-ngn-ip-next-generation-network/white_paper_c11-481360.html">1</a></sup>.
Every second, over 10,000 hours of video are streamed.
The technical term for the quantity of videos people watch every year is a million jillion. You know this.</p>
</ol>
<h3>What LBRY Isn't</h3>
<p>LBRY's fully decentralized nature makes restricting content impossible. Since LBRY also aims to unseat gigantic, established media players,
we fear it may attract undeserved legal attention. So we'd like to be clear from day one:</p>
<p>
<strong>LBRY is not about facilitating piracy.</strong>
LBRY is about creating a network where creators and patrons can directly interact without relying on anyone in the middle. We've made choices
about publisher identities and how addresses are reserved that are specifically designed to combat undue profiteering.</p>
<h3>Ready to use LBRY?</h3>
<p><a href="/get" class="btn-primary">Get LBRY</a></p>
<p>Or, <a href="/team" class="link-primary">learn about joining the team</a>.</p>
</div>
<p>What you may not know: <em>video distribution is fundamentally flawed</em>.</p>
<p>
The fatal flaw of existing systems is their centralized, top-down design. The consequences:
</p>
<ol>
<li><p><strong>Increased costs to consumers.</strong> Providers bear significant infrastructure costs, regulatory and compliance costs,
and must create complex systems to govern a simple process (copying a number).</p></li>
<li><p><strong>Terrible consumer experience.</strong>
Centralization leads to fragmentation, as providers compete to lock numbers in digit dungeons.</p>
</li>
<li>
<p><strong>Poor producer experience.</strong>
The primary want of a producer is to be paid for making things. Instead, producers frequently lose control of their content and
lose profits to the inefficiency of current systems.</p>
</li>
</ol>
<p>Similar issues of economics and experience exist for consumers and producers of information of all kinds (e.g. news, facts), not just videos.</p>
<p>LBRY solves these problems and throws in some other sweet innovations just for funsies.</p>
</div>
<div class="hero hero-quote hero-img spacer2" style="background-image: url(/img/cover-swartz.jpg)">
<div class="hero-content-wrapper">
<div class="hero-content">
<blockquote>
<p>Information is power.</p>
<p>But like all power, there are those who want to keep it for themselves.
</blockquote>
<cite>Aaron Swartz</cite>
</div>
</div>
</div>
<div class="content spacer2">
<h3>An Alternative</h3>
<p>LBRY avoids the mistakes of centralization and middlemen. It says:</p>
<ol>
<li>
<p>
<strong>Information isn't a thing</strong>
Things are physical and exist in the world. When I have a thing, you can't. Economists call this <em>rivalry</em><sup><a href="//en.wikipedia.org/wiki/Rivalry_%28economics%29">?</a></sup>.
</p>
<p>
Information is non-rival. Information is just a number. There is nothing easier to replicate than information.
LBRY embraces (and adores) this reality.
</p>
<p>
LBRY breaks information into thousands of identifiable tiny pieces and spreads them throughout the internet, reducing costs
for both providers and consumers.
</p>
<div class="spacer2">
<img src="/img/xkcd-comic.png" alt="XKCD #1228 Prometheus"/>
<div class="meta text-center"><a href="https://xkcd.com/1228/">XKCD #1228</a></div>
</div>
</li>
<li>
<p>
<strong>Connecting creators and consumers directly is best.</strong>
Do we need middlemen spending billions to extract their rent and police others?
A better system allows consumers to easily and directly pay content creators.
We want to eliminate extortionists charging tolls.
</p>
<p>
On LBRY, publishers sell directly to patrons. Publishers can charge a set fee per decryption key for content or create an assurance contract for unpublished content.
</p>
</li>
<li>
<p><strong>It's Up to Us.</strong> A smart guy once said that power corrupts and absolutely power corrupts absolutely.</p>
<p>
LBRY leaves no one in charge (including us). It puts power in the hands of individuals and users rather than corporations and executives.
</p>
<p>We think that world will be more creative, more charitable, and more fair. We hope you'll join us in creating it.</p>
</li>
</ol>
<h3>What LBRY Isn't</h3>
<p>LBRY's fully decentralized nature makes restricting content impossible. Since LBRY also aims to unseat gigantic, established media players,
we fear it may attract undeserved legal attention. So we'd like to be clear from day one:</p>
<p>
<strong>LBRY is not about facilitating piracy.</strong>
LBRY is about creating a network where creators and patrons can directly interact without relying on anyone in the middle. We've made choices
about publisher identities and how addresses are reserved that are specifically designed to combat undue profiteering.</p>
<h3>Ready to use LBRY?</h3>
<p><a href="/get" class="btn-primary">Get LBRY</a></p>
<p>Or, <a href="/team" class="link-primary">learn about joining the team</a>.</p>
</div>
</main>
<?php echo View::render('nav/footer') ?>
<?php /* It is inspired by Bitcoin, BitTorrent, and&nbsp;a comment by Julian Assange<sup><a class="link-primary" href="https://wikileaks.org/Transcript-Meeting-Assange-Schmidt.html#731">1</a></sup>.</p> */ ?>

View file

@ -1,4 +1,6 @@
<?php
include $_SERVER['ROOT_DIR'] . '/autoload.php';
i18n::register();
Session::init();
Controller::dispatch($_SERVER['REQUEST_URI']);

View file

@ -59,7 +59,7 @@ $(document).ready(function() {
function resizeVideo(iframe)
{
var maxWidth = Math.min(iframe.closest('.video').width(), iframe.data('maxWidth')),
var maxWidth = Math.min(iframe.offsetParent().width(), iframe.data('maxWidth')),
maxHeight = iframe.data('maxHeight'),
ratio = iframe.data('aspectRatio');

View file

@ -14,10 +14,6 @@ body
line-height: 1.3333;
min-height: 100%;
position: relative;
&.with-footer
{
padding-bottom: $spacing-vertical * 3;
}
}
.bg-image-full
{
@ -58,6 +54,7 @@ sub { top: 0.4em; }
.spacer2 { margin-bottom: $spacing-vertical * 2; }
.text-center { text-align: center; }
.meta { font-size: 0.8em; }
.meta-large { font-size: 1.2em; }
.link-primary
{
@ -145,4 +142,16 @@ a:hover img
{
display: none;
}
}
body
{
@include display-flex();
@include flex-flow(column);
min-height: 100vh;
main
{
@include flex(2);
}
}

View file

@ -6,20 +6,27 @@
max-width: $max-content-width; /*we have more padding than desirable so numbers from ol can exceed container*/
padding-left: 15px;
padding-right: 15px;
color: #333;
h1, h2, h3, h4, h5, h6
{
color: $color-text-dark;
&:not(:first-child)
{
margin-top: $spacing-vertical * 1.5;
}
}
.meta
&:not(.content-dark)
{
color: #505050;
color: #333;
h1, h2, h3, h4, h5, h6
{
color: $color-text-dark;
}
.meta
{
color: #505050;
}
}
&.content-dark
@ -31,11 +38,15 @@
p
{
max-width: $max-text-width;
margin-bottom: $spacing-vertical;
margin-left: auto;
margin-right: auto;
}
p.pflow
{
margin-left: 0;
margin-right: 0;
}
ul, ol
{
> li
@ -44,6 +55,11 @@
margin-left: auto;
margin-right: auto;
}
&.no-style
{
list-style: none;
> li { list-style: none; }
}
}
ul
{
@ -84,6 +100,15 @@
margin-right: auto;
}
}
.content-inset
{
margin-left: $spacing-vertical;
margin-right: $spacing-vertical;
}
main > .content
{
margin-top: $spacing-vertical;
}
@media(max-width: $max-text-width + 30)
{

View file

@ -1,23 +1,25 @@
@import "global";
.cover-and-header
{
@include flex();
flex-direction: column;
min-height: 100vh;
.cover
{
flex: 1 0 auto;
}
.header
{
margin-bottom: 0;
}
}
.cover
{
@include absolute-center();
text-align: center;
@box-sizing(border-box);
.meta-large [class*="icon"]
{
padding-left: 5px;
padding-right: 5px;
}
}
@media (max-width: $mobile-width-threshold) {
.cover { padding: $spacing-vertical; }
}
@media (min-width: $mobile-width-threshold) {
.cover { padding: $spacing-vertical * 2 $spacing-vertical * 3; }
}
.cover-center
{
@include flex-direction(column);
@include absolute-center();
}
.cover-dark
{
@ -29,10 +31,11 @@
color: #333;
.cover-title { color: black; }
}
.cover-content
.cover-dark-grad
{
padding: 10px;
@include linear-gradient(darken($color-primary, 5), lighten($color-primary, 5));
}
.cover-title
{
margin-bottom: $spacing-vertical;
@ -43,16 +46,4 @@
{
margin: $spacing-vertical 0 $spacing-vertical;
font-size: 1.1em;
}
.cover-search
{
margin-bottom: $spacing-vertical * 2;
input
{
font-size: $font-size * 1.5;
height: $spacing-vertical * 1.5;
margin-bottom: $spacing-vertical * 0.5;
width: 520px;
max-width: 100%;
}
}

View file

@ -1,24 +1,26 @@
@import "global";
$input-width: 300px;
input[type="email"], input[type="text"]
{
border: 0 none;
border: 1px solid rgba(160,160,160,.5);
padding-left: 5px;
padding-right: 5px;
width: 300px;
width: $input-width;
height: $spacing-vertical * 1.5;
}
.mail-submit
{
input
{
margin-right: 10px;
}
input, .btn-primary
{
vertical-align: bottom;
margin-bottom: $spacing-vertical / 2;
}
input
{
margin-right: 10px;
}
input, .btn-primary
{
margin-bottom: $spacing-vertical / 2;
vertical-align: bottom;
}
}

View file

@ -33,7 +33,7 @@ $max-text-width: 660px;
border-radius: $radius;
}
@mixin flex()
@mixin display-flex()
{
display: -webkit-box;
display: -moz-box;
@ -42,9 +42,31 @@ $max-text-width: 660px;
display: flex;
}
@mixin flex($columns)
{
-webkit-flex: $columns;
-moz-flex: $columns;
-ms-flex: $columns;
flex: $columns;
}
@mixin flex-flow($flow) {
-webkit-flex-flow: $flow;
-moz-flex-flow: $flow;
-ms-flex-flow: $flow;
flex-flow: $flow;
}
@mixin flex-direction($direction) {
-webkit-flex-direction: $direction;
-moz-flex-direction: $direction;
-ms-flex-direction: $direction;
flex-direction: $direction;
}
@mixin absolute-center()
{
@include flex();
@include display-flex();
-webkit-box-align: center;
-moz-box-align: center;
-ms-flex-align: center;

View file

@ -57,12 +57,23 @@ $gutter_fluid: 4;
}
}
.column-fluid {
@include display-flex();
flex-wrap: wrap;
> [class*="span"] {
@include display-flex();
@include flex(1 0 auto);
overflow: hidden;
justify-content: center;
}
}
.row-fluid, .tile-fluid {
@include clearfix();
}
@media (max-width: $mobile-width-threshold) {
.row-fluid, .tile-fluid {
.row-fluid, .tile-fluid, .column-fluid {
width: 100%;
}
.pull-left, .pull-right
@ -73,5 +84,6 @@ $gutter_fluid: 4;
float: none !important;
width: 100% !important;
margin-left: 0 !important;
display: block !important;
}
}

View file

@ -6,7 +6,6 @@ $color-nav-border: #ddd;
{
width: 100%;
padding: 15px 0;
margin-bottom: $spacing-vertical;
@include clearfix();
position: relative;
z-index: 1;
@ -119,10 +118,7 @@ $color-nav-border: #ddd;
border-top: 1px $color-nav-border solid;
border-bottom: 1px $color-nav-border solid;
padding: $spacing-vertical / 2 0;
position: absolute;
width: 100%;
bottom: 0;
left: 0;
}
.footer-img-link
{
@ -130,11 +126,4 @@ $color-nav-border: #ddd;
height: $spacing-vertical * 1.5;
img { height: $spacing-vertical * 1.5; }
vertical-align: middle;
}
@media (max-width: $mobile-width-threshold)
{
body.with-footer
{
padding-bottom: $spacing-vertical * 5;
}
}