Giter VIP home page Giter VIP logo

reiverr's Introduction

Reiverr

Stargazers GitHub issues Discord Version Size

Reiverr is a project that aims to create a single UI for interacting with TMDB, Jellyfin, Radarr and Sonarr, as well as be an alternative to Overseerr.

This project is still in early stages, and many features are still missing / being tested and changed. Contributions are welcome! See contributing for more information.

Demo Video

Reiverr 1.0

This is the page for Reiverr 2.0, which is a rewrite of the project with TVs in mind. It still lacks many features of the previous version. If you want a more stable experience, or only care about the web app, you might want to check out the 1.0 branch for now.

List of major features

TMDB Discovery:

  • Discover trending movies and TV shows
  • Get personalized recommendations based on your ratings
  • Browse movies and TV shows by genre or network
  • View details about movies and TV shows, such as cast, crew, ratings & a trailer.
  • Movie & TV show search

Local Library & Playback

  • Stream Movies & TV shows (from Jellyfin library)
  • Create requests for movies & TV shows in Radarr & Sonarr
  • Manage local library files
  • View Radarr & Sonarr stats (disk space, items, etc.)

For a list of planned features & known bugs, see Reiverr Taskboard.

Installation

The easiest and the recommended way to install Reiverr is via Docker. Make sure to update the api keys and base URLs to match your setup.

Docker CLI

docker run -it --init \
  --name reiverr \
  --restart unless-stopped \
  -p 9494:9494 \
  -v /path/to/appdata/config:/config \
  ghcr.io/aleksilassila/reiverr:latest

Docker compose

version: '3.8'

name: reiverr

services:
  reiverr:
    image: ghcr.io/aleksilassila/reiverr:latest
    container_name: reiverr
    ports:
      - 9494:9494
    environment:
      - SECRET=your_secret_here # optional, used to sign JWT tokens for authentication. If not set, sessions will not persist between server restarts. Use a random string.
      - ADMIN_USERNAME=admin # optional
      - ADMIN_PASSWORD=admin # optional
    volumes:
      - /path/to/appdata/config:/config
    restart: unless-stopped

Building from Source

  1. Requirements(ish):
    • Node v18.14.0 or higher
    • NPM v9.3.1 or higher
  2. Clone from master or download the latest source
  3. Build the app:
    npm install
    npm install --prefix backend
    npm run build
  4. Start the app:
    node backend/dist/src/main

Reiverr will be accessible via port 9494 by default.

Tizen / Samsung Smart TVs

To be able to use Reiverr on TVs, you'll still need to host the backend server on a separate device. See the above methods for instructions on how to set up the backend / web app.

There are plans to attempt getting the app to the official store. In the meantime, you have to manually build and install the app using Tizen Studio or the CLI, following roughly these steps:

  1. Follow the manual installation steps above to install the dependencies (npm install)
  2. Download either Tizen Studio or the CLI tools from the official website
  3. Connect Tizen Studio to your TV
  4. Use the following command to build and install the app on your TV:

    npm run build:tizen;C:\tizen-studio\tools\ide\bin\tizen.bat build-web -- tizen;C:\tizen-studio\tools\ide\bin\tizen.bat package -t wgt -o .\tizen -- .\tizen\.buildResult\;C:\tizen-studio\tools\ide\bin\tizen.bat install -n .\tizen\Reiverr.wgt -t QE55Q64TAUXXC.

    You may need to replace the paths for Tizen Studio tools according to your installation location, as well as the device identifier, which was in my case the tv model number.

    Alternatively, you can open the project in Tizen Studio and install the project on a device from there. For more instructions on run a project on a device, see here.

If you have any questions or run into issues or bugs, you can start a discussion, open an issue or check out the Discord channel. If find a feature request that you'd like to see implemented, you can react to it with a thumbs up.

Other Platforms

The roadmap includes plans to support the following platforms in the future:

  • Windows Desktop App
  • MacOS Desktop App
  • Android TV / WebOS

Post Installation

To create the first user account, you can log in with any credentials and an admin account will be created. Alternatively, you can define the admin username and password using environment variables, as seen in the Docker Compose example. A new admin account is only created if there are no previous accounts with the same name. To get most out of Reiverr, it is recommended to connect to TMDB, Jellyfin, Radarr and Sonarr.

Hint: Radarr & Sonarr API keys can be found under Settings > General in their respective web UIs. Jellyfin API key is located under Administration > Dashboard > Advanced > API Keys in the Jellyfin Web UI.

Contributing

Unlike the most Servarr projects, this one is built with Svelte and NestJS. If you haven't used Svelte before, don't worry, this was my first Svelte project too. I'd recommend reading the official Svelte tutorial to get started.

To see a list of missing features & known bugs that you can help with, see Reiverr Taskboard. Feel free to also create your own issues for bug reports or feature requests, as well as discussions for general questions. Issues with the community label are issues that I can't or won't work on myself, and are left for the community to pick up. Feel free to work on any issues though, even without the label.

Before you contribute:

  • If you are taking on an existing bug or feature ticket, it is encouraged to comment on the issue or mark yourself as an assignee at some point to avoid multiple people working on the same thing.
  • If the ticket is vague or missing information, please ask for clarification in the comments.
  • UI style should match the rest of the project, and it is a good idea to discuss the design beforehand, especially for larger design choices (issues labelled with design).
  • Conventional commits are encouraged.
  • When creating a pull request, please make sure to target the dev branch and mark the PR as a draft if it is a work in progress.

I'm not a designer, so if you have any ideas for improving the UI, I'd love to learn about them. If you are a designer and would like to help, contributions are much appreciated! Also the project is still missing a logo :)

Development

To get started with development:

  1. Clone the repository
  2. Check out the dev branch
  3. Install dependencies
    npm install
    npm install --prefix backend
  4. To start the frontend: npm run dev or npx vite --host if you want to expose the server
  5. To start the backend: npm run --prefix backend start:dev

Notes

  • 2.0 will primarily target TVs, so the UI must be optimized with TVs in mind. This means larger text, buttons, etc. Design Guide for Android TV is a good resource for how to design for TVs.
  • The app should support old browsers all the way to Chromium 69, as that's what used in Tizen 5.5. This means that you might not be able to use the latest browser features, or that you'll have to use a polyfill. caniuse.com is a great resource if you need to check compatibility.
    • Most of the time you don't need to worry about this, but one big feature that's not available in older browsers is css gap property. You can use the space-x and space-y classes from Tailwind CSS to achieve the same effect.

Useful resources

Additional Screenshots

Landing Page

Series Page

Library Page

reiverr's People

Contributors

aleksilassila avatar alvitali avatar axelazo avatar axiompraxis avatar fabricionaweb avatar ifraan avatar jordanf97 avatar oxixes avatar programmer584 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

reiverr's Issues

Missing images on Discovery tab

I don't see the images in the git repo.

reiverr               | Error: Not found: /genres/documentary.jpg
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3925:18)
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3800:34)
reiverr               |     at #options.hooks.handle (file:///usr/src/app/build/server/index.js:3970:61)
reiverr               |     at respond (file:///usr/src/app/build/server/index.js:3798:43)
reiverr               |     at runNextTicks (node:internal/process/task_queues:60:5)
reiverr               |     at process.processImmediate (node:internal/timers:447:9)
reiverr               | Error: Not found: /genres/drama.jpg
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3925:18)
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3800:34)
reiverr               |     at #options.hooks.handle (file:///usr/src/app/build/server/index.js:3970:61)
reiverr               |     at respond (file:///usr/src/app/build/server/index.js:3798:43)
reiverr               |     at runNextTicks (node:internal/process/task_queues:60:5)
reiverr               |     at process.processImmediate (node:internal/timers:447:9)
reiverr               | Error: Not found: /genres/family.jpg
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3925:18)
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3800:34)
reiverr               |     at #options.hooks.handle (file:///usr/src/app/build/server/index.js:3970:61)
reiverr               |     at respond (file:///usr/src/app/build/server/index.js:3798:43)
reiverr               |     at runNextTicks (node:internal/process/task_queues:60:5)
reiverr               |     at process.processImmediate (node:internal/timers:447:9)
reiverr               | Error: Not found: /genres/fantasy.jpg
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3925:18)
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3800:34)
reiverr               |     at #options.hooks.handle (file:///usr/src/app/build/server/index.js:3970:61)
reiverr               |     at respond (file:///usr/src/app/build/server/index.js:3798:43)
reiverr               |     at runNextTicks (node:internal/process/task_queues:60:5)
reiverr               |     at process.processImmediate (node:internal/timers:447:9)
reiverr               | Error: Not found: /genres/history.jpg
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3925:18)
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3800:34)
reiverr               |     at #options.hooks.handle (file:///usr/src/app/build/server/index.js:3970:61)
reiverr               |     at respond (file:///usr/src/app/build/server/index.js:3798:43)
reiverr               |     at runNextTicks (node:internal/process/task_queues:60:5)
reiverr               |     at process.processImmediate (node:internal/timers:447:9)
reiverr               | Error: Not found: /genres/horror.jpg
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3925:18)
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3800:34)
reiverr               |     at #options.hooks.handle (file:///usr/src/app/build/server/index.js:3970:61)
reiverr               |     at respond (file:///usr/src/app/build/server/index.js:3798:43)
reiverr               | Error: Not found: /genres/music.jpg
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3925:18)
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3800:34)
reiverr               |     at #options.hooks.handle (file:///usr/src/app/build/server/index.js:3970:61)
reiverr               |     at respond (file:///usr/src/app/build/server/index.js:3798:43)
reiverr               |     at runNextTicks (node:internal/process/task_queues:60:5)
reiverr               |     at process.processImmediate (node:internal/timers:447:9)
reiverr               | Error: Not found: /genres/mystery.jpg
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3925:18)
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3800:34)
reiverr               |     at #options.hooks.handle (file:///usr/src/app/build/server/index.js:3970:61)
reiverr               |     at respond (file:///usr/src/app/build/server/index.js:3798:43)
reiverr               |     at runNextTicks (node:internal/process/task_queues:60:5)
reiverr               |     at process.processImmediate (node:internal/timers:447:9)
reiverr               | Error: Not found: /genres/romance.jpg
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3925:18)
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3800:34)
reiverr               |     at #options.hooks.handle (file:///usr/src/app/build/server/index.js:3970:61)
reiverr               |     at respond (file:///usr/src/app/build/server/index.js:3798:43)
reiverr               |     at runNextTicks (node:internal/process/task_queues:60:5)
reiverr               |     at process.processImmediate (node:internal/timers:447:9)
reiverr               | Error: Not found: /genres/scienceFiction.jpg
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3925:18)
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3800:34)
reiverr               |     at #options.hooks.handle (file:///usr/src/app/build/server/index.js:3970:61)
reiverr               |     at respond (file:///usr/src/app/build/server/index.js:3798:43)
reiverr               |     at runNextTicks (node:internal/process/task_queues:60:5)
reiverr               |     at process.processImmediate (node:internal/timers:447:9)
reiverr               | Error: Not found: /genres/tvMovie.jpg
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3925:18)
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3800:34)
reiverr               |     at #options.hooks.handle (file:///usr/src/app/build/server/index.js:3970:61)
reiverr               |     at respond (file:///usr/src/app/build/server/index.js:3798:43)
reiverr               | Error: Not found: /genres/thriller.jpg
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3925:18)
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3800:34)
reiverr               |     at #options.hooks.handle (file:///usr/src/app/build/server/index.js:3970:61)
reiverr               |     at respond (file:///usr/src/app/build/server/index.js:3798:43)
reiverr               |     at runNextTicks (node:internal/process/task_queues:60:5)
reiverr               |     at process.processImmediate (node:internal/timers:447:9)
reiverr               | Error: Not found: /genres/war.jpg
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3925:18)
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3800:34)
reiverr               |     at #options.hooks.handle (file:///usr/src/app/build/server/index.js:3970:61)
reiverr               |     at respond (file:///usr/src/app/build/server/index.js:3798:43)
reiverr               |     at runNextTicks (node:internal/process/task_queues:60:5)
reiverr               |     at process.processImmediate (node:internal/timers:447:9)
reiverr               | Error: Not found: /genres/western.jpg
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3925:18)
reiverr               |     at resolve (file:///usr/src/app/build/server/index.js:3800:34)
reiverr               |     at #options.hooks.handle (file:///usr/src/app/build/server/index.js:3970:61)
reiverr               |     at respond (file:///usr/src/app/build/server/index.js:3798:43)

Fix discovery page missing genre images

Hey,

I noticed that on my setup using server device DNS or reverse proxy (traefik) I get 404 on discovery page then loading image assets.

GET http://reiverr.arr/genres/documentary.jpg 404 (Not Found)
drama.jpg:1     GET http://reiverr.arr/genres/drama.jpg 404 (Not Found)
family.jpg:1     GET http://reiverr.arr/genres/family.jpg 404 (Not Found)
fantasy.jpg:1     GET http://reiverr.arr/genres/fantasy.jpg 404 (Not Found)
history.jpg:1     GET http://reiverr.arr/genres/history.jpg 404 (Not Found)
horror.jpg:1     GET http://reiverr.arr/genres/horror.jpg 404 (Not Found)
music.jpg:1     GET http://reiverr.arr/genres/music.jpg 404 (Not Found)
mystery.jpg:1     GET http://reiverr.arr/genres/mystery.jpg 404 (Not Found)
romance.jpg:1     GET http://reiverr.arr/genres/romance.jpg 404 (Not Found)
scienceFiction.jpg:1     GET http://reiverr.arr/genres/scienceFiction.jpg 404 (Not Found)
tvMovie.jpg:1     GET http://reiverr.arr/genres/tvMovie.jpg 404 (Not Found)
thriller.jpg:1     GET http://reiverr.arr/genres/thriller.jpg 404 (Not Found)
war.jpg:1     GET http://reiverr.arr/genres/war.jpg 404 (Not Found)
western.jpg:1     GET http://reiverr.arr/genres/western.jpg 404 (Not Found)

It may be routing or binding issue in the engine you are using or docker config.

P.S. Nice project I like to see that you opened it up. You will not make everybody happy, so find a way to just ignore a lot of feature requests.

Use backend to proxy jellyfin, sonarr and radarr requests to hide the api keys from the browser

I understand that this is something that will probably change in the future, but I'll remark it still just in case. The Sonarr / Radarr api key is exposed when clicking "Request [something]+", which could lead to unauthorized users to take control over these platforms, so the server should do the requests to sonarr / radarr, acting as a middle man, to avoid the keys being leaked.

Thanks for creating this project, I'll try to help and contribute to it in the near future!

Use thumbnails instead of backdrops for posters

It seems like the posters for TV shows and movies are backdrops. In Jellyfin these are typically more artistic images that are meant to go in the background while you're scrolling through the app. Many of them don't have the title of the show because they're intended to be artitistic rather than present information from the show. Thumbnails would be a better choice as posters since most of them have the title of the show on them. They're landscape as well so they'll look just as good with the current design of the website.

I've attached two files showing what I mean. You can see that instead of the thumnbnail for 13th in the images section of my Jellyfin server that has the logo and the name of the movie on it, The backdrop is shown which just has a clip of the movie with someone talking. It's this backdrop that's used on Reiverr rather than the thumbnail which tells you the name of the show without having to hover over it.

![Screenshot 2023-08-11 at 19-05-05 Reiverr](
Screenshot 2023-08-11 at 19-04-51 Jellyfin
https://github.com/aleksilassila/reiverr/assets/65052394/d108cdee-8ce1-45ef-ac8d-7e39418ce31b)

Bug - JSON Parsing

Hello, I just installed reiverr but I'm not able to get it to work.
I can see the requests at Jellyfin/Sonarr/Radarr working fine but nothing shows up in the Source/Library tabs.
The only hint I have is from the browser console.

Uncaught (in promise) SyntaxError: Unexpected token 'E', "Error proc"... is not valid JSON

Is it a known issue ? I'm trying to find more clues about what"s causing the issue but no logs are showing except that

Add playback casting support

Hey,

Video players are hard... that is why Jellyfin is so big so... I suggest adding an environmental or option/setting that lets you set a custom "Play" command.
I personally would try to figure out how to use Jellyfin's "Play on..."/"Cast" command to use this as UI for controlling what gets played on tv.

Linux Support

Will this have any support outside of docker? As of this moment only see one installation method which is through docker.

Doesn't work on ARM64

i installed the docker compose on a raspberry pi 4 8go de ram and the container doesn't boot on CasaOS

CORS errors when connecting to Radarr/Sonarr/Jellyfin

Very exciting project! I just tried setting this up, and I'm getting CORS errors when trying to connect to any of the external services. I've got everything in a docker network together, and am using the hostnames of each service.

CleanShot 2023-08-11 at 10 58 14

(I've also tried local addresses like http://127.0.0.1:7878 from the example, and am getting the same CORS errors)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.