# Spee.ch Spee.ch is a web app that reads and publishes images and videos to and from the [LBRY](https://lbry.io/) blockchain. You are encouraged to contribute to the shared code base, or fork it and make it your own. You can create your own custom version of spee.ch by installing this code base and then creating your own custom components and styles to override the defaults. (More details / guide on how to do that coming soon.) ## Quick start ### Prepare your environment Install Node * [link](https://nodejs.org) Start MySQL * install [mysql](https://dev.mysql.com/doc/refman/8.0/en/installing.html) * create a database * save the `database`, `username`, and `password` someplace handy Start LBRY * install the [`lbry`](https://github.com/lbryio/lbry) daemon * start the `lbry` daemon * retrieve an address from the daemon and send your wallet a couple credits (or join us in the [#speech discord channel](https://discord.gg/YjYbwhS) and we will send you a few) Install ffmpeg * [link](https://www.ffmpeg.org/download.html) Clone this repo ``` $ git clone https://github.com/lbryio/spee.ch.git ``` ### Build and Start the App Change directory into your project ``` $ cd spee.ch ``` Install node dependencies ``` $ npm install ``` Create the config files using the built in CLI ``` $ npm run configure ``` _note: add your ip address in `config/siteConfig.json` after completion_ Build the app (transpile source with babel and bundle with webpack) ``` $ npm run build ``` start the app ``` $ npm run start ``` ### View in browser visit [localhost:3000](http://localhost:3000) in your browser ### (optional) add custom components and update the styles * create custom components by creating React components in `src/views/` (further instructions coming soon) * update the css by changing the files in `public/assets/css/` (further instructions and refactor coming soon) ### (optional) Syncing the full blockchain Start the `spee.ch-sync` tool available at [billbitt/spee.ch-sync](https://github.com/billbitt/spee.ch-sync) This is not necessary, but highly reccomended. It will decode the blocks of the `LBRY` blockchain and add the claims information to your database's tables ## API * _(post)_ /api/claim/publish * example: `curl -F 'name=MyPictureName' -F 'file=@/path/to/myPicture.jpeg' https://spee.ch/api/claim/publish` * Parameters: * `name` (required) * `file` (required) (must be type .mp4, .jpeg, .jpg, .gif, or .png) * `nsfw` (optional) * `license` (optional) * `title` (optional) * `description` (optional) * `thumbnail` url to thumbnail image, for .mp4 uploads only (optional) * `channelName` channel to publish too (optional) * `channelPassword` password for channel to publish too (optional, but required if `channelName` is provided) * _(get)_ /api/claim/resolve/:name/:claimId * example: `curl https://spee.ch/api/claim/resolve/doitlive/xyz` * _(get)_ /api/claim/list/:name * example: `curl https://spee.ch/api/claim/list/doitlive` * _(get)_ /api/claim/availability/:name * returns the name if it is available * example: `curl https://spee.ch/api/claim/availability/doitlive` * _(get)_ /api/channel/availability/:name * returns the name if it is available * example: `curl https://spee.ch/api/channel/availability/@CoolChannel` ## Contribute ### Stack The spee.ch stack is MySQL, Express.js, Node.js, and React.js. Spee.ch also runs `lbrynet` on its server, and it uses the `lbrynet` api to make requests -- such as `publish`, `create_channel`, and `get` -- on the `LBRY` network. Spee.ch also runs a sync tool, which decodes blocks from the `LBRY` blockchain as they are mined, and stores the information in mysql. It stores all claims in the `Claims` table, and all channel claims in the `Certificates` table. * server * [mysql](https://www.mysql.com/) * [express](https://www.npmjs.com/package/express) * [node](https://nodejs.org/) * [lbry](https://github.com/lbryio/lbry) * [ffmpeg](https://www.ffmpeg.org/) * client * [react](https://reactjs.org/) ### Architecture * the `server/` folder contains all of the server code * `index.js` is the entry point for the server. It creates the [express app](https://expressjs.com/), requires the routes, syncs the database, and starts the server listening on the `PORT` designated in the config file. * the `server/routes` folder contains all of the routes for the express app * the `server/models` folder contains all of the models which the app uses to interact with the `mysql` database. Note: this app uses the [sequelize](http://docs.sequelizejs.com/) ORM. * the `client/` folder contains all of the client code ### Issue tags in this repo #### level 1 Issues that anyone with basic web development can handle; little-to-no experience with the spee.ch codebase is required. #### level 2 Familiarity with web apps is required, but little-to-no familiarity with the lbry daemon is necessary #### level 3 Familiarity with the spee.ch code base and how the lbry daemon functions is required #### level 4 Issues with lbry (e.g. the spee.ch wallet, lbrynet configuration, etc.) that require strong familiarity with the lbry daemon and/or network to fix. Generally these issues are best suited for the `lbry` `protocol team` but are reported in this repo because of they are part of the spee.ch implementation ### Tests * This package uses `mocha` with `chai` for testing. * Before running tests, create a `testingConfig.js` file in `devConfig/` by copying `testingConfig.example.js` * To run tests: * To run all tests, including those that require LBC (like publishing), simply run `npm test` * To run only tests that do not require LBC, run `npm run test:no-lbc` ### URL formats Below is a list of all possible urls for the content on spee.ch * controlling, free `LBRY` claim * spee.ch/claim (show) * spee.ch/claim.ext (serve) * specific `LBRY` claim * spee.ch/claim_id/claim * spee.ch/claim_id/claim.ext * all free contents for the controlling `LBRY` channel * spee.ch/@channel * a specific `LBRY` channel * spee.ch/@channel:channel_id * a specific claim within the controlling `LBRY` channel * spee.ch/@channel/claim (show) * spee.ch/@channel/claim.ext (serve) * a specific claim within a specific `LBRY` channel * spee.ch/@channel:channel_id/claim * spee.ch/@channel:channel_id/claim.ext ## Bugs If you find a bug or experience a problem, please report your issue here on github and find us in the lbry discord!