Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c074f7b8a4 | |||
| c5c69aa0bf | |||
| 107948ef04 | |||
| 036cb55fa8 | |||
| 3077f02867 | |||
| e3dac1e383 | |||
| 5d0d4ca2e6 | |||
| 32e4cf98a0 | |||
| e5873f9134 | |||
| 4c0fb6f74d | |||
| 412f1cfa63 | |||
| 904cd762ca | |||
| 8a65d49d72 | |||
| 8643d9918d | |||
| 9cf16dc634 | |||
| 347f89973d | |||
| 6bd3b48e2a | |||
| 89487156c2 | |||
| 27c70fca15 | |||
| 8e44f45a8f | |||
| a8f810fe84 | |||
| ccbef2d228 | |||
| 4e46e74896 | |||
| 768c7c4776 | |||
| a486de48d6 | |||
| 1659aa91a4 | |||
| 5ee79631d1 | |||
| 7ae9ffeee3 |
@@ -1,15 +0,0 @@
|
||||
.DS_Store
|
||||
node_modules
|
||||
/build
|
||||
/.svelte-kit
|
||||
/package
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
|
||||
/doc
|
||||
|
||||
# Ignore files for PNPM, NPM and YARN
|
||||
pnpm-lock.yaml
|
||||
package-lock.json
|
||||
yarn.lock
|
||||
@@ -1,27 +0,0 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
parser: "@typescript-eslint/parser",
|
||||
extends: ["plugin:svelte/recommended"],
|
||||
plugins: ["@typescript-eslint"],
|
||||
ignorePatterns: ["*.cjs", "*.config.js"],
|
||||
overrides: [
|
||||
{
|
||||
files: ["*.svelte"],
|
||||
parser: "svelte-eslint-parser",
|
||||
parserOptions: {
|
||||
parser: "@typescript-eslint/parser"
|
||||
}
|
||||
}
|
||||
],
|
||||
parserOptions: {
|
||||
project: "./tsconfig.json",
|
||||
extraFileExtensions: [".svelte"],
|
||||
sourceType: "module",
|
||||
ecmaVersion: 2020
|
||||
},
|
||||
env: {
|
||||
browser: true,
|
||||
es2017: true,
|
||||
node: false
|
||||
}
|
||||
};
|
||||
@@ -1,2 +0,0 @@
|
||||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
@@ -1,5 +0,0 @@
|
||||
<!-- Make sure your code is formatted by running `npm run format` or using prettier manually. -->
|
||||
|
||||
### Changes made
|
||||
|
||||
<!-- Describe changes made here. If changes are visual a screenshot could be useful! -->
|
||||
@@ -1,27 +0,0 @@
|
||||
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
# Web UI
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "ui"
|
||||
|
||||
# Server
|
||||
- package-ecosystem: "gomod"
|
||||
directory: "/server"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "server"
|
||||
|
||||
# Workflows
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/" # / will look in /.github/workflows directory by default
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "workflow"
|
||||
@@ -1,45 +0,0 @@
|
||||
# Multi arch support doc/guide:
|
||||
# https://docs.docker.com/build/ci/github-actions/multi-platform/
|
||||
|
||||
name: Development Watcharr Image Release
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
image: ghcr.io/sbondco/watcharr
|
||||
|
||||
jobs:
|
||||
release-dev-image:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- name: Checkout Repo
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ env.image }}:dev
|
||||
labels: ${{ env.image }}:${{ github.sha }}
|
||||
@@ -1,50 +0,0 @@
|
||||
name: Release Watcharr Image
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- v*
|
||||
|
||||
env:
|
||||
image: ghcr.io/sbondco/watcharr
|
||||
|
||||
jobs:
|
||||
release-images:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- name: Checkout Repo
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.image }}
|
||||
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
@@ -1,50 +0,0 @@
|
||||
name: Publish Docs
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- dev
|
||||
paths:
|
||||
- ".github/workflows/publish-docs.yml"
|
||||
- "doc/**"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
name: Deploy to GitHub Pages
|
||||
runs-on: ubuntu-latest
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
defaults:
|
||||
run:
|
||||
working-directory: doc
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 18
|
||||
cache: npm
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
- name: Build website
|
||||
run: npm run build
|
||||
|
||||
# Popular action to deploy to GitHub Pages:
|
||||
# Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus
|
||||
- name: Deploy to GitHub Pages
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
# Build output to publish to the `gh-pages` branch:
|
||||
publish_dir: ./doc/build
|
||||
cname: watcharr.app
|
||||
# The following lines assign commit authorship to the official
|
||||
# GH-Actions bot for deploys to `gh-pages` branch:
|
||||
# https://github.com/actions/checkout/issues/13#issuecomment-724415212
|
||||
# The GH actions bot is used by default if you didn't specify the two fields.
|
||||
# You can swap them out with your own user credentials.
|
||||
user_name: github-actions[bot]
|
||||
user_email: 41898282+github-actions[bot]@users.noreply.github.com
|
||||
@@ -1,28 +0,0 @@
|
||||
name: Test doc deployment
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- dev
|
||||
paths:
|
||||
- ".github/workflows/test-docs.yml"
|
||||
- "doc/**"
|
||||
|
||||
jobs:
|
||||
test-deploy:
|
||||
name: Test deployment
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: doc
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 18
|
||||
cache: npm
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
- name: Test build website
|
||||
run: npm run build
|
||||
@@ -1,28 +0,0 @@
|
||||
name: Test PR Changes
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- "**"
|
||||
tags-ignore:
|
||||
- v*
|
||||
|
||||
jobs:
|
||||
linter_check:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "20"
|
||||
cache: "npm"
|
||||
|
||||
- name: Get dependencies
|
||||
run: npm i
|
||||
|
||||
- name: Check for linting/formatting errors
|
||||
run: npm run lint
|
||||
@@ -1,47 +0,0 @@
|
||||
# If you prefer the allow list template instead of the deny list, see community template:
|
||||
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
|
||||
#
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
|
||||
# Go workspace file
|
||||
go.work
|
||||
|
||||
# Database
|
||||
*.db
|
||||
|
||||
# Server data
|
||||
server/data
|
||||
|
||||
# web
|
||||
.DS_Store
|
||||
node_modules
|
||||
/build
|
||||
/.svelte-kit
|
||||
/package
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
vite.config.js.timestamp-*
|
||||
vite.config.ts.timestamp-*
|
||||
|
||||
# Docker dev volume
|
||||
container_data/
|
||||
data/
|
||||
|
||||
# Build artifacts
|
||||
server/ui
|
||||
server/watcharr
|
||||
@@ -1,13 +0,0 @@
|
||||
.DS_Store
|
||||
node_modules
|
||||
/build
|
||||
/.svelte-kit
|
||||
/package
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
|
||||
# Ignore files for PNPM, NPM and YARN
|
||||
pnpm-lock.yaml
|
||||
package-lock.json
|
||||
yarn.lock
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"tabWidth": 2,
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"printWidth": 100,
|
||||
"useTabs": false,
|
||||
"trailingComma": "none",
|
||||
"arrowParens": "always",
|
||||
"plugins": ["prettier-plugin-svelte"],
|
||||
"overrides": [
|
||||
{
|
||||
"files": "*.svelte",
|
||||
"options": {
|
||||
"parser": "svelte"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Launch Package",
|
||||
"type": "go",
|
||||
"request": "launch",
|
||||
"mode": "auto",
|
||||
"program": "${fileDirname}"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
<!doctype html>
|
||||
<html lang="en" dir="ltr" class="plugin-native plugin-id-default" data-has-hydrated="false">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="Docusaurus v3.9.2">
|
||||
<title data-rh="true">Page Not Found | Watcharr Docs</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://watcharr.app/img/social-card.png"><meta data-rh="true" name="twitter:image" content="https://watcharr.app/img/social-card.png"><meta data-rh="true" property="og:url" content="https://watcharr.app/404.html"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="Page Not Found | Watcharr Docs"><link data-rh="true" rel="icon" href="/img/favicon.png"><link data-rh="true" rel="canonical" href="https://watcharr.app/404.html"><link data-rh="true" rel="alternate" href="https://watcharr.app/404.html" hreflang="en"><link data-rh="true" rel="alternate" href="https://watcharr.app/404.html" hreflang="x-default"><link rel="stylesheet" href="/assets/css/styles.b440cd64.css">
|
||||
<script src="/assets/js/runtime~main.9a9f349d.js" defer="defer"></script>
|
||||
<script src="/assets/js/main.04a4ba76.js" defer="defer"></script>
|
||||
</head>
|
||||
<body class="navigation-with-keyboard">
|
||||
<svg style="display: none;"><defs>
|
||||
<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
|
||||
</defs></svg>
|
||||
<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/favicon.png"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/favicon.png" alt="Watcharr Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/img/favicon.png" alt="Watcharr Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">Watcharr</b></a><a class="navbar__item navbar__link" href="/docs/introduction">Docs</a><a class="navbar__item navbar__link" href="/docs/introduction">Next</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://beta.watcharr.app" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Demo<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://github.com/sbondCo/Watcharr" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="navbarSearchContainer_Bca1"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><main class="container margin-vert--xl"><div class="row"><div class="col col--6 col--offset-3"><h1 class="hero__title">Page Not Found</h1><p>We could not find what you were looking for.</p><p>Please contact the owner of the site that linked you to the original URL and let them know their link is broken.</p></div></div></main></div></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,11 +0,0 @@
|
||||
# Contributing 🎉
|
||||
|
||||
First of all, thank you for looking into contributing! 🫡
|
||||
|
||||
Feel free to contribute in any way: 🐞 bug reports, 💡 ideas, 🥖 new features etc - everything is welcome!
|
||||
|
||||
For big PRs (lots of changes/big change in the way something works), if you'd like, it can be discussed first in an issue (dont want to waste anyones time!).
|
||||
|
||||
## Project Board
|
||||
|
||||
We have a [board to organize new features and bug fixes](https://github.com/orgs/sbondCo/projects/9/views/2) to be worked on. If you see something you'd like to work on, just ask in the issue and it can be assigned to you. Even if it isn't set for the next milestone already, it can be.
|
||||
@@ -1,35 +0,0 @@
|
||||
# Backend
|
||||
FROM golang:1.21-alpine AS server
|
||||
|
||||
WORKDIR /server
|
||||
COPY server/*.go server/go.* ./
|
||||
COPY server/arr/*.go ./arr/
|
||||
COPY server/game/*.go ./game/
|
||||
|
||||
# Required so we can build with cgo
|
||||
RUN apk update && apk add --no-cache musl-dev gcc build-base
|
||||
|
||||
# CGO_CFLAGS: https://github.com/mattn/go-sqlite3/issues/1164#issuecomment-1635253695
|
||||
RUN go mod download && GOOS=linux CGO_ENABLED=1 CGO_CFLAGS="-D_LARGEFILE64_SOURCE" go build -o ./watcharr
|
||||
|
||||
# Frontend
|
||||
FROM node:20-alpine AS ui
|
||||
|
||||
WORKDIR /app
|
||||
COPY package*.json vite.config.ts svelte.config.js tsconfig.json ./
|
||||
COPY ./src ./src
|
||||
COPY ./static ./static
|
||||
|
||||
RUN npm install && npm run build
|
||||
|
||||
# Production
|
||||
FROM node:20-alpine AS runner
|
||||
|
||||
COPY --from=server /server/watcharr /
|
||||
COPY --from=ui /app/build /ui
|
||||
COPY --from=ui /app/package.json /app/package-lock.json /ui
|
||||
RUN cd /ui && npm ci --omit=dev
|
||||
|
||||
EXPOSE 3080
|
||||
|
||||
CMD ["/watcharr"]
|
||||
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 IRHM
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,60 +0,0 @@
|
||||
<h1 align="center">Watcharr</h1>
|
||||
<p align="center"><img src="./static/logo-col.png" alt="logo" width="250" /></p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/sbondCo/Watcharr/pkgs/container/watcharr"><img src="https://img.shields.io/github/v/release/sbondCo/Watcharr?label=version&style=for-the-badge" /></a>
|
||||
<a href="https://beta.watcharr.app"><img src="https://img.shields.io/website?label=DEMO&style=for-the-badge&url=https%3A%2F%2Fbeta.watcharr.app" /></a>
|
||||
<a href="https://watcharr.app"><img src="https://img.shields.io/website?label=DOCS&style=for-the-badge&url=https%3A%2F%2Fwatcharr.app" /></a>
|
||||
<a href="https://github.com/sbondCo/Watcharr/issues"><img src="https://img.shields.io/github/issues-raw/sbondCo/Watcharr?label=ISSUES&style=for-the-badge" /></a>
|
||||
<a href="/LICENSE"><img src="https://img.shields.io/github/license/sbondCo/Watcharr?style=for-the-badge" /></a>
|
||||
<a href="https://matrix.to/#/#watcharr:matrix.org"><img src="https://img.shields.io/matrix/watcharr%3Amatrix.org?style=for-the-badge&logo=matrix" /></a>
|
||||
</p>
|
||||
|
||||
I'm your new easily self-hosted content watched list. The place you store your watched (or watching, planned, etc) **movies** and **tv shows** (and **anime**), rate them and track their status.
|
||||
|
||||
With [some extra configuration](https://watcharr.app/docs/server_config/game-support-igdb) I can also track your **video games**.
|
||||
|
||||
I am built with Go and Svelte(Kit).
|
||||
|
||||
Feel free to abuse this demo instance (nicely), which runs on the latest `dev` build (there may be bugs, as new features are tested on here too): [https://beta.watcharr.app/](https://beta.watcharr.app/)
|
||||
|
||||
[Track Progress Until Next Version](https://github.com/orgs/sbondCo/projects/9/views/3)
|
||||
|
||||
### Contents
|
||||
|
||||
- [Screenshots](#screenshots)
|
||||
- [Setup](#set-up)
|
||||
- [Contributing](CONTRIBUTING.md)
|
||||
- [Getting Help](#getting-help)
|
||||
|
||||
# Screenshots
|
||||
|
||||
<p align="center">
|
||||
|
||||
| Homepage | Watched Show Hover |
|
||||
| ---------------------------------------------------------- | ----------------------------------------------------------------------- |
|
||||
| <img src="./screenshot/homepage.png" alt="Watched List" /> | <img src="./screenshot/homepage-poster-hover.png" alt="Watched List" /> |
|
||||
|
||||
| Watched Show Status Change | Movie Details |
|
||||
| --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
|
||||
| <img src="./screenshot/homepage-poster-change-status.png" alt="Changing Show Status" /> | <img src="./screenshot/content-details-page.png" alt="Content Details Page" /> |
|
||||
|
||||
| User Profile | Discover |
|
||||
| ------------------------------------------------------------------- | ---------------------------------------------------------------- |
|
||||
| <img src="./screenshot/user-profile.png" alt="User Profile Page" /> | <img src="./screenshot/discover-page.png" alt="Discover Page" /> |
|
||||
|
||||
| Dark Homepage | Dark Content Details |
|
||||
| ---------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
|
||||
| <img src="./screenshot/homepage-dark.png" alt="Dark Theme Homepage" /> | <img src="./screenshot/content-details-page-dark.png" alt="Dark Theme Content Page" /> |
|
||||
|
||||
</p>
|
||||
|
||||
# Set Up
|
||||
|
||||
[Checkout our documentation](https://watcharr.app/docs/category/installation) for an up to date guide on setup! If you hate manuals, but love docker, this [docker-compose.yml](./docker-compose.yml) file is your friend.
|
||||
|
||||
# Getting Help
|
||||
|
||||
If something isn't working for you or you are stuck, [creating an issue](https://github.com/sbondCo/Watcharr/issues/new) is the best way to get help! Every type of issue is accepted, so don't be afraid to ask anything!
|
||||
|
||||
You can also [join our space on Matrix](https://matrix.to/#/#watcharr:matrix.org) for support.
|
||||
|
After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 305 KiB After Width: | Height: | Size: 305 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 369 KiB After Width: | Height: | Size: 369 KiB |
|
Before Width: | Height: | Size: 321 KiB After Width: | Height: | Size: 321 KiB |
|
Before Width: | Height: | Size: 303 KiB After Width: | Height: | Size: 303 KiB |
|
Before Width: | Height: | Size: 317 KiB After Width: | Height: | Size: 317 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 675 KiB After Width: | Height: | Size: 675 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[61],{7973(e,a,t){t.r(a),t.d(a,{default:()=>h});t(6540);var s=t(4164),l=t(5500),d=t(7559),i=t(1656),c=t(540),r=t(7763),n=t(6896),o=t(2153);const m="mdxPageWrapper_j9I6";var g=t(4848);function h(e){const{content:a}=e,{metadata:t,assets:h}=a,{title:p,editUrl:x,description:j,frontMatter:_,lastUpdatedBy:A,lastUpdatedAt:v}=t,{keywords:w,wrapperClassName:u,hide_table_of_contents:N}=_,b=h.image??_.image,k=!!(x||v||A);return(0,g.jsx)(l.e3,{className:(0,s.A)(u??d.G.wrapper.mdxPages,d.G.page.mdxPage),children:(0,g.jsxs)(i.A,{children:[(0,g.jsx)(l.be,{title:p,description:j,keywords:w,image:b}),(0,g.jsx)("main",{className:"container container--fluid margin-vert--lg",children:(0,g.jsxs)("div",{className:(0,s.A)("row",m),children:[(0,g.jsxs)("div",{className:(0,s.A)("col",!N&&"col--8"),children:[(0,g.jsx)(n.A,{metadata:t}),(0,g.jsx)("article",{children:(0,g.jsx)(c.A,{children:(0,g.jsx)(a,{})})}),k&&(0,g.jsx)(o.A,{className:(0,s.A)("margin-top--sm",d.G.pages.pageFooterEditMetaRow),editUrl:x,lastUpdatedAt:v,lastUpdatedBy:A})]}),!N&&a.toc.length>0&&(0,g.jsx)("div",{className:"col col--2",children:(0,g.jsx)(r.A,{toc:a.toc,minHeadingLevel:_.toc_min_heading_level,maxHeadingLevel:_.toc_max_heading_level})})]})})]})})}}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[237],{3363(e,t,i){i.d(t,{A:()=>s});i(6540);var n=i(4164),o=i(1312),a=i(1107),r=i(4848);function s({className:e}){return(0,r.jsx)("main",{className:(0,n.A)("container margin-vert--xl",e),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(a.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},2237(e,t,i){i.r(t),i.d(t,{default:()=>h});i(6540);var n=i(1312),o=i(5500),a=i(1656),r=i(3363),s=i(4848);function h(){const e=(0,n.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.be,{title:e}),(0,s.jsx)(a.A,{children:(0,s.jsx)(r.A,{})})]})}}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[134],{591(e,t,n){n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"type":"mdx","permalink":"/markdown-page","source":"@site/src/pages/markdown-page.md","title":"Markdown page example","description":"You don\'t need React to write simple standalone pages.","frontMatter":{"title":"Markdown page example"},"unlisted":false}');var o=n(4848),r=n(8453);const s={title:"Markdown page example"},c="Markdown page example",p={},d=[];function i(e){const t={h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"markdown-page-example",children:"Markdown page example"})}),"\n",(0,o.jsx)(t.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(i,{...e})}):i(e)}},8453(e,t,n){n.d(t,{R:()=>s,x:()=>c});var a=n(6540);const o={},r=a.createContext(o);function s(e){const t=a.useContext(r);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[647],{7121(r,a,e){e.r(a),e.d(a,{default:()=>o});e(6540);var c=e(4164),s=e(7559),h=e(5500),t=e(2831),u=e(1656),l=e(4848);function o(r){return(0,l.jsx)(h.e3,{className:(0,c.A)(s.G.wrapper.docsPages),children:(0,l.jsx)(u.A,{children:(0,t.v)(r.route.routes)})})}}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[990],{6948(e,r,t){t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"importing/watcharr","title":"Watcharr","description":"You may consider a backup of your server before starting any import. They are not easily reversible, though we do our best to ensure they are accurate and bug free!","source":"@site/docs/importing/watcharr.md","sourceDirName":"importing","slug":"/importing/watcharr","permalink":"/docs/importing/watcharr","draft":false,"unlisted":false,"editUrl":"https://github.com/sbondCo/Watcharr/tree/dev/doc/docs/importing/watcharr.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"Importing","permalink":"/docs/category/importing"},"next":{"title":"Text File (.txt list)","permalink":"/docs/importing/text-file"}}');var n=t(4848),i=t(8453);const a={sidebar_position:0},s="Watcharr",c={},d=[];function l(e){const r={a:"a",admonition:"admonition",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.header,{children:(0,n.jsx)(r.h1,{id:"watcharr",children:"Watcharr"})}),"\n",(0,n.jsx)(r.admonition,{title:"Backup?",type:"info",children:(0,n.jsx)(r.p,{children:"You may consider a backup of your server before starting any import. They are not easily reversible, though we do our best to ensure they are accurate and bug free!"})}),"\n",(0,n.jsx)(r.admonition,{title:"May not be what you want",type:"warning",children:(0,n.jsxs)(r.p,{children:["Watcharr import/export is a feature intended for end users. If you are the server admin, it is recommended that you copy your server files directly to any new server you are creating (it'll be much faster and easier). ",(0,n.jsx)(r.a,{href:"/docs/server_config/backup",children:"See backup guide"}),"."]})}),"\n",(0,n.jsxs)(r.ol,{children:["\n",(0,n.jsx)(r.li,{children:"Provide the Watcharr export file (that you generated from your profile page)."}),"\n",(0,n.jsx)(r.li,{children:"Review the import table, if everything looks good, start the import."}),"\n"]})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453(e,r,t){t.d(r,{R:()=>a,x:()=>s});var o=t(6540);const n={},i=o.createContext(n);function a(e){const r=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function s(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(i.Provider,{value:r},e.children)}}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[449],{9095(e,t,n){n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>r,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"usage/adding-to-watchlist","title":"Adding To Your Watchlist","description":"Adding movies or shows to your watchlist is the core feature of Watcharr.","source":"@site/docs/usage/adding-to-watchlist.md","sourceDirName":"usage","slug":"/usage/adding-to-watchlist","permalink":"/docs/usage/adding-to-watchlist","draft":false,"unlisted":false,"editUrl":"https://github.com/sbondCo/Watcharr/tree/dev/doc/docs/usage/adding-to-watchlist.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Usage","permalink":"/docs/category/usage"}}');var o=n(4848),i=n(8453);const r={sidebar_position:1},a="Adding To Your Watchlist",c={},d=[];function h(e){const t={code:"code",em:"em",h1:"h1",header:"header",img:"img",li:"li",ol:"ol",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"adding-to-your-watchlist",children:"Adding To Your Watchlist"})}),"\n",(0,o.jsx)(t.p,{children:"Adding movies or shows to your watchlist is the core feature of Watcharr."}),"\n",(0,o.jsx)(t.p,{children:"The homepage is where your list will appear once you have added some."}),"\n",(0,o.jsx)(t.p,{children:"To get started, you can follow along with these steps to add your first movie/show:"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsx)(t.p,{children:"Search for the content:"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Searching For Content",src:n(8406).A+"",width:"745",height:"440"})}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsx)(t.p,{children:"Hover or click on the content you want to add:"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Hovering over poster",src:n(6320).A+"",width:"745",height:"440"})}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsx)(t.p,{children:"Clicking the + (Plus) icon will let you give the content a status."}),"\n",(0,o.jsxs)(t.p,{children:["Currently supported statuses include: ",(0,o.jsx)(t.code,{children:"Finished"}),", ",(0,o.jsx)(t.code,{children:"Watching"}),", ",(0,o.jsx)(t.code,{children:"Held"}),", ",(0,o.jsx)(t.code,{children:"Planned"}),", ",(0,o.jsx)(t.code,{children:"Dropped"}),"."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Giving content a status",src:n(2385).A+"",width:"745",height:"440"})}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsx)(t.p,{children:"Rate the content."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Giving content a rating",src:n(1985).A+"",width:"745",height:"440"})}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(t.p,{children:["If you prefer, you can also do this by clicking/tapping on the active poster again.\nThis will take you to the contents full page. Here you can see all the options, including\nadding ",(0,o.jsx)(t.code,{children:"Thoughts"})," for the content."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Content full page",src:n(8234).A+"",width:"745",height:"837"})}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.code,{children:"Thoughts"})," can be anything you would like to write down or remember about the specific movie/show.\nFor example, sometimes I like to write something specific that I ",(0,o.jsx)(t.em,{children:"really"})," liked about the content,\nor for some shows, I write down my favourite seasons and how many times I have watched them."]})]})}function l(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8234(e,t,n){n.d(t,{A:()=>s});const s=n.p+"assets/images/content-full-page-4cdac3f6a414c03b6231b32db57cd7ff.png"},1985(e,t,n){n.d(t,{A:()=>s});const s=n.p+"assets/images/search-for-content-hover-poster-rate-23ebec4c88db3592961ba6d72a75183e.png"},2385(e,t,n){n.d(t,{A:()=>s});const s=n.p+"assets/images/search-for-content-hover-poster-status-19fe5d733c26eb921d1ae59e37717d19.png"},6320(e,t,n){n.d(t,{A:()=>s});const s=n.p+"assets/images/search-for-content-hover-poster-6574ac86e280bfa112b04635b9689e9a.png"},8406(e,t,n){n.d(t,{A:()=>s});const s=n.p+"assets/images/search-for-content-c81935a18e93b262ca2adb89783fa9aa.png"},8453(e,t,n){n.d(t,{R:()=>r,x:()=>a});var s=n(6540);const o={},i=s.createContext(o);function r(e){const t=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[671],{2040(e,r,t){t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"server_config/backup","title":"Backing Up","description":"Backing up your server.","source":"@site/docs/server_config/backup.md","sourceDirName":"server_config","slug":"/server_config/backup","permalink":"/docs/server_config/backup","draft":false,"unlisted":false,"editUrl":"https://github.com/sbondCo/Watcharr/tree/dev/doc/docs/server_config/backup.md","tags":[],"version":"current","sidebarPosition":100,"frontMatter":{"sidebar_position":100,"description":"Backing up your server."},"sidebar":"tutorialSidebar","previous":{"title":"Environment Variables","permalink":"/docs/server_config/environment-variables"},"next":{"title":"Importing","permalink":"/docs/category/importing"}}');var i=t(4848),s=t(8453);const a={sidebar_position:100,description:"Backing up your server."},o="Backing Up",c={},d=[{value:"Simple Steps",id:"simple-steps",level:2},{value:"Advanced Steps",id:"advanced-steps",level:2}];function l(e){const r={admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.header,{children:(0,i.jsx)(r.h1,{id:"backing-up",children:"Backing Up"})}),"\n",(0,i.jsx)(r.p,{children:"Watcharr cannot handle backing up for you, but its simple structure should make it easy to slide it into your existing backup routine."}),"\n",(0,i.jsx)(r.p,{children:"Once you have created your first backup, it's recommended that you try restoring from that backup to make sure everything is correct and will work in case you need to restore from it in the future."}),"\n",(0,i.jsx)(r.admonition,{title:"Shutdown your server!",type:"danger",children:(0,i.jsx)(r.p,{children:"Always shutdown Watcharr before backing up its data, otherwise you run the risk of corrupting files (mainly your database)."})}),"\n",(0,i.jsx)(r.h2,{id:"simple-steps",children:"Simple Steps"}),"\n",(0,i.jsx)(r.admonition,{title:"Recommended",type:"success",children:(0,i.jsx)(r.p,{children:"This is the recommended way to backup."})}),"\n",(0,i.jsxs)(r.p,{children:["Here are the steps that are run daily for the ",(0,i.jsx)(r.code,{children:"beta.watcharr.app"})," instance."]}),"\n",(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsx)(r.li,{children:"Shutdown Watcharr."}),"\n",(0,i.jsxs)(r.li,{children:["Copy and backup the entire ",(0,i.jsx)(r.code,{children:"data"})," folder (default location is ",(0,i.jsx)(r.code,{children:"./data"}),", backup whichever folder your server is configured to store its data in)."]}),"\n",(0,i.jsx)(r.li,{children:"Start Watcharr."}),"\n"]}),"\n",(0,i.jsx)(r.p,{children:"I call these the simple steps because they simply backup your entire server, if you ever need to restore your server, it will start up from its exact state at backup."}),"\n",(0,i.jsx)(r.h2,{id:"advanced-steps",children:"Advanced Steps"}),"\n",(0,i.jsx)(r.admonition,{title:"Discouraged",type:"danger",children:(0,i.jsx)(r.p,{children:"Backing up this way is discouraged because new important files could be added later and missed."})}),"\n",(0,i.jsx)(r.p,{children:'If you don\'t care about the warning not to backup this way, here are the "important" files that you can single out for backup:'}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.code,{children:"watcharr.db"})," & ",(0,i.jsx)(r.code,{children:"watcharr.db-wal"})," Your database, holds all users, their watchlists, etc."]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.code,{children:"watcharr.json"})," Server config."]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.code,{children:"img/up"})," Profile picture uploads."]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.code,{children:"img/games"})," Game posters (not exactly important, but scenarios in which this folder is not backed up have not been tested, only relevant for servers with game support enabled)."]}),"\n"]})]})}function u(e={}){const{wrapper:r}={...(0,s.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453(e,r,t){t.d(r,{R:()=>a,x:()=>o});var n=t(6540);const i={},s=n.createContext(i);function a(e){const r=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(s.Provider,{value:r},e.children)}}}]);
|
||||
@@ -0,0 +1,9 @@
|
||||
/*!
|
||||
* Viewer.js v1.11.7
|
||||
* https://fengyuanchen.github.io/viewerjs
|
||||
*
|
||||
* Copyright 2015-present Chen Fengyuan
|
||||
* Released under the MIT license
|
||||
*
|
||||
* Date: 2024-11-24T04:32:19.116Z
|
||||
*/
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[352],{5421(e){e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Usage","description":"Hopefully Watcharr is easy enough to get started with and use, but incase you are stuck, one of these usage guides may help.","slug":"/category/usage","permalink":"/docs/category/usage","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Trakt","permalink":"/docs/importing/trakt"},"next":{"title":"Adding To Your Watchlist","permalink":"/docs/usage/adding-to-watchlist"}}}}')}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[899],{1920(t,e,n){n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>a,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"introduction","title":"Introduction","description":"Watcharr is for the peeps who like to keep a list of all the content they have ever watched.","source":"@site/docs/introduction.md","sourceDirName":".","slug":"/introduction","permalink":"/docs/introduction","draft":false,"unlisted":false,"editUrl":"https://github.com/sbondCo/Watcharr/tree/dev/doc/docs/introduction.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","next":{"title":"Installation","permalink":"/docs/category/installation"}}');var r=n(4848),i=n(8453);const a={sidebar_position:1},s="Introduction",c={},d=[];function h(t){const e={a:"a",h1:"h1",header:"header",p:"p",...(0,i.R)(),...t.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.header,{children:(0,r.jsx)(e.h1,{id:"introduction",children:"Introduction"})}),"\n",(0,r.jsx)(e.p,{children:"Watcharr is for the peeps who like to keep a list of all the content they have ever watched."}),"\n",(0,r.jsxs)(e.p,{children:["If you would like more insight, the ",(0,r.jsx)(e.a,{href:"/docs/usage/adding-to-watchlist",children:"adding to your watchlist guide"}),"\nis a great example of how Watcharr is used."]})]})}function l(t={}){const{wrapper:e}={...(0,i.R)(),...t.components};return e?(0,r.jsx)(e,{...t,children:(0,r.jsx)(h,{...t})}):h(t)}},8453(t,e,n){n.d(e,{R:()=>a,x:()=>s});var o=n(6540);const r={},i=o.createContext(r);function a(t){const e=o.useContext(i);return o.useMemo(function(){return"function"==typeof t?t(e):{...e,...t}},[e,t])}function s(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:a(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[235],{8552(a){a.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[98],{1723(n,e,r){r.r(e),r.d(e,{default:()=>d});r(6540);var s=r(5500);function o(n,e){return`docs-${n}-${e}`}var t=r(3025),c=r(2831),a=r(1463),i=r(4848);function u(n){const{version:e}=n;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.A,{version:e.version,tag:o(e.pluginId,e.version)}),(0,i.jsx)(s.be,{children:e.noIndex&&(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function l(n){const{version:e,route:r}=n;return(0,i.jsx)(s.e3,{className:e.className,children:(0,i.jsx)(t.n,{version:e,children:(0,c.v)(r.routes)})})}function d(n){return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(u,{...n}),(0,i.jsx)(l,{...n})]})}}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[887],{3419(e,n,t){t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"installation/docker-compose","title":"Docker Compose","description":"Install and setup with Docker Compose.","source":"@site/docs/installation/docker-compose.md","sourceDirName":"installation","slug":"/installation/docker-compose","permalink":"/docs/installation/docker-compose","draft":false,"unlisted":false,"editUrl":"https://github.com/sbondCo/Watcharr/tree/dev/doc/docs/installation/docker-compose.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"description":"Install and setup with Docker Compose."},"sidebar":"tutorialSidebar","previous":{"title":"Installation","permalink":"/docs/category/installation"},"next":{"title":"From Source","permalink":"/docs/installation/from-source"}}');var s=t(4848),a=t(8453);const r={sidebar_position:1,description:"Install and setup with Docker Compose."},i="Docker Compose",c={},l=[{value:"Installing",id:"installing",level:2},{value:"Updating",id:"updating",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"docker-compose",children:"Docker Compose"})}),"\n",(0,s.jsx)(n.h2,{id:"installing",children:"Installing"}),"\n",(0,s.jsx)(n.p,{children:"Installing Watcharr with a docker compose file is easy. You can copy the example below to get started:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n watcharr:\n # The :latest tag is used for simplicity, it is recommended\n # to use an actual version, then when updating check the releases for changelogs.\n image: ghcr.io/sbondco/watcharr:latest\n container_name: watcharr\n ports:\n - 3080:3080\n volumes:\n # Contains all of watcharr data (database & cache)\n - ./data:/data\n restart: unless-stopped\n"})}),"\n",(0,s.jsx)(n.admonition,{title:"first account",type:"danger",children:(0,s.jsxs)(n.p,{children:["When ",(0,s.jsx)(n.strong,{children:"first"})," running Watcharr, make sure only you have access. The first user created will become admin."]})}),"\n",(0,s.jsxs)(n.p,{children:["You can now start ",(0,s.jsx)(n.code,{children:"Watcharr"})," like so:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\n"})}),"\n",(0,s.jsxs)(n.p,{children:["If you didn't change the ports in the example, the server will be available at ",(0,s.jsx)(n.a,{href:"http://localhost:3080/",children:"http://localhost:3080/"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"updating",children:"Updating"}),"\n",(0,s.jsxs)(n.admonition,{title:"Take care",type:"danger",children:[(0,s.jsx)(n.p,{children:"We try taking care as to not release breaking changes, however it is still recommended that\nyou lookover changelogs before updating!"}),(0,s.jsxs)(n.p,{children:["Breaking changes are marked at the top of releases: ",(0,s.jsx)(n.a,{href:"https://github.com/sbondCo/Watcharr/releases",children:"https://github.com/sbondCo/Watcharr/releases"})]})]}),"\n",(0,s.jsx)(n.p,{children:"Updating your server can be done in two steps:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Update the ",(0,s.jsx)(n.code,{children:"image"})," version in your ",(0,s.jsx)(n.code,{children:"docker-compose.yml"})," file.\nSkip this step if you are using the ",(0,s.jsx)(n.code,{children:"latest"})," tag."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"# eg. update v1.19.0 to v1.20.0 (or whatever version you are updating to)\nimage: ghcr.io/sbondco/watcharr:v1.19.0\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Pull the new changes and re-create your container:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose pull && docker compose down && docker compose up -d\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"And that is it!"})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453(e,n,t){t.d(n,{R:()=>r,x:()=>i});var o=t(6540);const s={},a=o.createContext(s);function r(e){const n=o.useContext(a);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(a.Provider,{value:n},e.children)}}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[742],{7093(a){a.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[287],{934(e,t,n){n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"importing/trakt","title":"Trakt","description":"You may consider a backup of your server before starting any import. They are not easily reversible, though we do our best to ensure they are accurate and bug free!","source":"@site/docs/importing/trakt.md","sourceDirName":"importing","slug":"/importing/trakt","permalink":"/docs/importing/trakt","draft":false,"unlisted":false,"editUrl":"https://github.com/sbondCo/Watcharr/tree/dev/doc/docs/importing/trakt.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"MyAnimeList","permalink":"/docs/importing/myanimelist"},"next":{"title":"Usage","permalink":"/docs/category/usage"}}');var r=n(4848),o=n(8453);const s={sidebar_position:3},a="Trakt",c={},l=[{value:"(Optional) API Key",id:"optional-api-key",level:3},{value:"Getting an API Key",id:"getting-an-api-key",level:4}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"trakt",children:"Trakt"})}),"\n",(0,r.jsx)(t.admonition,{title:"Backup?",type:"info",children:(0,r.jsx)(t.p,{children:"You may consider a backup of your server before starting any import. They are not easily reversible, though we do our best to ensure they are accurate and bug free!"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Note:"})," Your Trakt profile must be public ",(0,r.jsx)(t.em,{children:"during"})," this process. You are free to private it again once it completes."]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsx)(t.li,{children:"Provide your Trakt username in the text box."}),"\n",(0,r.jsxs)(t.li,{children:["(Optional) ",(0,r.jsx)(t.a,{href:"#optional-api-key",children:"Provide your own api key"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Press ",(0,r.jsx)(t.code,{children:"Start Import"}),"."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"This will be a long process, possibly a couple hours depending on how large of a Trakt history you have. If you think it has frozen or isn't working, try checking your server logs to see if it is doing anything."}),"\n",(0,r.jsx)(t.h3,{id:"optional-api-key",children:"(Optional) API Key"}),"\n",(0,r.jsxs)(t.p,{children:["This step is optional because Watcharr comes built in with its own API Key that it can use for your import, however, if you encounter any issues where imports cannot start or keep failing and you see any ",(0,r.jsx)(t.code,{children:"403"})," errors in your server logs, providing your own key may fix the problem."]}),"\n",(0,r.jsx)(t.h4,{id:"getting-an-api-key",children:"Getting an API Key"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://trakt.tv/oauth/applications/new",children:"Visit this link to create a new Trakt API App"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Fill out all required fields (",(0,r.jsx)(t.code,{children:"Name"})," and ",(0,r.jsx)(t.code,{children:"Redirect uri"}),") with any random data.","\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["You can set the ",(0,r.jsx)(t.code,{children:"Redirect uri"})," to any value the input accepts since we don't use it (eg: ",(0,r.jsx)(t.code,{children:"http://localhost"}),")"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["Click ",(0,r.jsx)(t.code,{children:"Save App"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["You should now be redirected to your new app. Copy the ",(0,r.jsx)(t.code,{children:"Client ID"})," into the ",(0,r.jsx)(t.code,{children:"API Key"})," textbox in Watcharr."]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453(e,t,n){n.d(t,{R:()=>s,x:()=>a});var i=n(6540);const r={},o=i.createContext(r);function s(e){const t=i.useContext(o);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[157],{2640(e,n,r){r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"server_config/environment-variables","title":"Environment Variables","description":"All environment variables you can use to start your server in a specific way.","source":"@site/docs/server_config/environment-variables.md","sourceDirName":"server_config","slug":"/server_config/environment-variables","permalink":"/docs/server_config/environment-variables","draft":false,"unlisted":false,"editUrl":"https://github.com/sbondCo/Watcharr/tree/dev/doc/docs/server_config/environment-variables.md","tags":[],"version":"current","sidebarPosition":11,"frontMatter":{"sidebar_position":11,"description":"All environment variables you can use to start your server in a specific way."},"sidebar":"tutorialSidebar","previous":{"title":"Restoring Admin Priviliges","permalink":"/docs/server_config/restoring-admin"},"next":{"title":"Backing Up","permalink":"/docs/server_config/backup"}}');var i=r(4848),a=r(8453);const o={sidebar_position:11,description:"All environment variables you can use to start your server in a specific way."},s="Environment Variables",c={},l=[{value:"<code>WATCHARR_DATA</code>",id:"watcharr_data",level:2}];function d(e){const n={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"environment-variables",children:"Environment Variables"})}),"\n",(0,i.jsx)(n.p,{children:"Currently there is only one, and maybe it will stay that way forever (because the admin interface can handle most settings). A very lonely page right now ;(."}),"\n",(0,i.jsx)(n.h2,{id:"watcharr_data",children:(0,i.jsx)(n.code,{children:"WATCHARR_DATA"})}),"\n",(0,i.jsx)(n.p,{children:"Make Watcharr use a custom directory for all of its data."}),"\n",(0,i.jsxs)(n.p,{children:["Defaults to ",(0,i.jsx)(n.code,{children:"./data"}),"."]})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453(e,n,r){r.d(n,{R:()=>o,x:()=>s});var t=r(6540);const i={},a=t.createContext(i);function o(e){const n=t.useContext(a);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[361],{1860(e,t,r){r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"importing/text-file","title":"Text File (.txt list)","description":"You may consider a backup of your server before starting any import. They are not easily reversible, though we do our best to ensure they are accurate and bug free!","source":"@site/docs/importing/text-file.md","sourceDirName":"importing","slug":"/importing/text-file","permalink":"/docs/importing/text-file","draft":false,"unlisted":false,"editUrl":"https://github.com/sbondCo/Watcharr/tree/dev/doc/docs/importing/text-file.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Watcharr","permalink":"/docs/importing/watcharr"},"next":{"title":"MyAnimeList","permalink":"/docs/importing/myanimelist"}}');var n=r(4848),o=r(8453);const a={sidebar_position:1},s="Text File (.txt list)",l={},c=[{value:"Format",id:"format",level:2},{value:"An example",id:"an-example",level:2}];function d(e){const t={admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"text-file-txt-list",children:"Text File (.txt list)"})}),"\n",(0,n.jsx)(t.admonition,{title:"Backup?",type:"info",children:(0,n.jsx)(t.p,{children:"You may consider a backup of your server before starting any import. They are not easily reversible, though we do our best to ensure they are accurate and bug free!"})}),"\n",(0,n.jsx)(t.p,{children:"The text file (.txt) import is of an arbitrary format (the one I used for years before creating Watcharr)."}),"\n",(0,n.jsx)(t.p,{children:"Hopefully it is useful for others with similar files or in scenarios where its the easiest to generate for an import (though if possible, when generating a backup from another service data manually, matching a Watcharr export would enable keeping more data)."}),"\n",(0,n.jsx)(t.h2,{id:"format",children:"Format"}),"\n",(0,n.jsx)(t.p,{children:"Each line is a new entry. The name of the content (show/movie) must be provided. Doesn't support specifying if name is for a show or movie, the importer will only automatically match on full search matches, if there are multiple results, you will be asked to pick the correct one."}),"\n",(0,n.jsx)(t.p,{children:"Optionally provide:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["The year in brackets (eg: ",(0,n.jsx)(t.code,{children:"(1983)"}),")"]}),"\n",(0,n.jsxs)(t.li,{children:["A rating (out of 10) in square brackets (eg: ",(0,n.jsx)(t.code,{children:"[4]"})," or ",(0,n.jsx)(t.code,{children:"[6.9]"}),")"]}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"<name> [(<year>)]\n"})}),"\n",(0,n.jsx)(t.h2,{id:"an-example",children:"An example"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"The Terminator (1984)\nBreaking Bad\nA Fistful of Dollars\nReacher (2022)\n"})})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453(e,t,r){r.d(t,{R:()=>a,x:()=>s});var i=r(6540);const n={},o=i.createContext(n);function a(e){const t=i.useContext(o);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[299],{1933(e){e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Server Configuration","description":"Learn how to configure your server.","slug":"/category/server-configuration","permalink":"/docs/category/server-configuration","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"For Development","permalink":"/docs/installation/for-development"},"next":{"title":"Games Support (via IGDB/Twitch)","permalink":"/docs/server_config/game-support-igdb"}}}}')}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[527],{7877(r){r.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Importing","description":"Guides for importing your data from other services.","slug":"/category/importing","permalink":"/docs/category/importing","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Backing Up","permalink":"/docs/server_config/backup"},"next":{"title":"Watcharr","permalink":"/docs/importing/watcharr"}}}}')}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[]).push([[545],{3608(o){o.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Installation","description":"Choose how you would like to install Watcharr.","slug":"/category/installation","permalink":"/docs/category/installation","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Introduction","permalink":"/docs/introduction"},"next":{"title":"Docker Compose","permalink":"/docs/installation/docker-compose"}}}}')}}]);
|
||||
@@ -0,0 +1,61 @@
|
||||
/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
|
||||
* @license MIT */
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* react-dom-client.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* react-dom.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* react-jsx-runtime.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* react.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* scheduler.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/** @license React v16.13.1
|
||||
* react-is.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
@@ -0,0 +1 @@
|
||||
(()=>{"use strict";var e,a,r,t,d,o={},c={};function n(e){var a=c[e];if(void 0!==a)return a.exports;var r=c[e]={id:e,loaded:!1,exports:{}};return o[e].call(r.exports,r,r.exports,n),r.loaded=!0,r.exports}n.m=o,n.c=c,e=[],n.O=(a,r,t,d)=>{if(!r){var o=1/0;for(i=0;i<e.length;i++){for(var[r,t,d]=e[i],c=!0,f=0;f<r.length;f++)(!1&d||o>=d)&&Object.keys(n.O).every(e=>n.O[e](r[f]))?r.splice(f--,1):(c=!1,d<o&&(o=d));if(c){e.splice(i--,1);var b=t();void 0!==b&&(a=b)}}return a}d=d||0;for(var i=e.length;i>0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[r,t,d]},n.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return n.d(a,{a:a}),a},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,n.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var d=Object.create(null);n.r(d);var o={};a=a||[null,r({}),r([]),r(r)];for(var c=2&t&&e;("object"==typeof c||"function"==typeof c)&&!~a.indexOf(c);c=r(c))Object.getOwnPropertyNames(c).forEach(a=>o[a]=()=>e[a]);return o.default=()=>e,n.d(d,o),d},n.d=(e,a)=>{for(var r in a)n.o(a,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:a[r]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((a,r)=>(n.f[r](e,a),a),[])),n.u=e=>"assets/js/"+({48:"a94703ab",61:"1f391b9e",97:"568bc3e4",98:"a7bd4aaa",134:"393be207",157:"c742a5ec",235:"a7456010",287:"b0e6f294",299:"d8d80848",303:"d9e31b1c",352:"8cfff9c6",361:"d37720bd",401:"17896441",449:"828ae7da",461:"d294ea5b",514:"6885b268",527:"e38456de",545:"f12d36e3",618:"45afa828",634:"c4f5d8e4",647:"5e95c892",671:"8494da2d",742:"aba21aa0",849:"0058b4c6",869:"760d6d76",887:"aa9d541a",899:"a09c2993",969:"14eb3368",990:"809512ee",996:"6b269b4f"}[e]||e)+"."+{48:"5e89ff31",61:"f6452e68",97:"4c00deee",98:"5c80c731",134:"77279b04",157:"62b9efe6",235:"690e10ce",237:"87ce40e0",285:"ecf30459",287:"8cd2710d",299:"ebec2bb9",303:"c2d8aa4b",352:"ea08dd5a",361:"926f1f6d",401:"a877991e",449:"8d5e1ada",461:"4573b1f1",514:"0ccd16fa",527:"20ed0ade",545:"6512db9b",618:"9315791c",634:"f084dabe",647:"9c713677",671:"a80f25ad",742:"1f888d55",849:"47da1b4d",869:"046a0bd6",887:"f25f6844",891:"e57a69c4",899:"82b1b8de",969:"fff76230",990:"17472274",996:"6fa89571"}[e]+".js",n.miniCssF=e=>{},n.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),t={},d="watcharr-doc:",n.l=(e,a,r,o)=>{if(t[e])t[e].push(a);else{var c,f;if(void 0!==r)for(var b=document.getElementsByTagName("script"),i=0;i<b.length;i++){var l=b[i];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==d+r){c=l;break}}c||(f=!0,(c=document.createElement("script")).charset="utf-8",n.nc&&c.setAttribute("nonce",n.nc),c.setAttribute("data-webpack",d+r),c.src=e),t[e]=[a];var u=(a,r)=>{c.onerror=c.onload=null,clearTimeout(s);var d=t[e];if(delete t[e],c.parentNode&&c.parentNode.removeChild(c),d&&d.forEach(e=>e(r)),a)return a(r)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=u.bind(null,c.onerror),c.onload=u.bind(null,c.onload),f&&document.head.appendChild(c)}},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.p="/",n.gca=function(e){return e={17896441:"401",a94703ab:"48","1f391b9e":"61","568bc3e4":"97",a7bd4aaa:"98","393be207":"134",c742a5ec:"157",a7456010:"235",b0e6f294:"287",d8d80848:"299",d9e31b1c:"303","8cfff9c6":"352",d37720bd:"361","828ae7da":"449",d294ea5b:"461","6885b268":"514",e38456de:"527",f12d36e3:"545","45afa828":"618",c4f5d8e4:"634","5e95c892":"647","8494da2d":"671",aba21aa0:"742","0058b4c6":"849","760d6d76":"869",aa9d541a:"887",a09c2993:"899","14eb3368":"969","809512ee":"990","6b269b4f":"996"}[e]||e,n.p+n.u(e)},(()=>{var e={354:0,250:0};n.f.j=(a,r)=>{var t=n.o(e,a)?e[a]:void 0;if(0!==t)if(t)r.push(t[2]);else if(/^(250|354)$/.test(a))e[a]=0;else{var d=new Promise((r,d)=>t=e[a]=[r,d]);r.push(t[2]=d);var o=n.p+n.u(a),c=new Error;n.l(o,r=>{if(n.o(e,a)&&(0!==(t=e[a])&&(e[a]=void 0),t)){var d=r&&("load"===r.type?"missing":r.type),o=r&&r.target&&r.target.src;c.message="Loading chunk "+a+" failed.\n("+d+": "+o+")",c.name="ChunkLoadError",c.type=d,c.request=o,t[1](c)}},"chunk-"+a,a)}},n.O.j=a=>0===e[a];var a=(a,r)=>{var t,d,[o,c,f]=r,b=0;if(o.some(a=>0!==e[a])){for(t in c)n.o(c,t)&&(n.m[t]=c[t]);if(f)var i=f(n)}for(a&&a(r);b<o.length;b++)d=o[b],n.o(e,d)&&e[d]&&e[d][0](),e[d]=0;return n.O(i)},r=globalThis.webpackChunkwatcharr_doc=globalThis.webpackChunkwatcharr_doc||[];r.forEach(a.bind(null,0)),r.push=a.bind(null,r.push.bind(r))})()})();
|
||||
@@ -1,20 +0,0 @@
|
||||
# Dependencies
|
||||
/node_modules
|
||||
|
||||
# Production
|
||||
/build
|
||||
|
||||
# Generated files
|
||||
.docusaurus
|
||||
.cache-loader
|
||||
|
||||
# Misc
|
||||
.DS_Store
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
@@ -1,41 +0,0 @@
|
||||
# Website
|
||||
|
||||
This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator.
|
||||
|
||||
### Installation
|
||||
|
||||
```
|
||||
$ yarn
|
||||
```
|
||||
|
||||
### Local Development
|
||||
|
||||
```
|
||||
$ yarn start
|
||||
```
|
||||
|
||||
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
|
||||
|
||||
### Build
|
||||
|
||||
```
|
||||
$ yarn build
|
||||
```
|
||||
|
||||
This command generates static content into the `build` directory and can be served using any static contents hosting service.
|
||||
|
||||
### Deployment
|
||||
|
||||
Using SSH:
|
||||
|
||||
```
|
||||
$ USE_SSH=true yarn deploy
|
||||
```
|
||||
|
||||
Not using SSH:
|
||||
|
||||
```
|
||||
$ GIT_USER=<Your GitHub username> yarn deploy
|
||||
```
|
||||
|
||||
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
presets: [require.resolve("@docusaurus/core/lib/babel/preset")]
|
||||
};
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"label": "Installation",
|
||||
"position": 2,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Choose how you would like to install Watcharr."
|
||||
}
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Docker Compose
|
||||
|
||||
## Installing
|
||||
|
||||
Installing Watcharr with a docker compose file is easy. You can copy the example below to get started:
|
||||
|
||||
```yaml title="docker-compose.yml"
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
watcharr:
|
||||
# The :latest tag is used for simplicity, it is recommended
|
||||
# to use an actual version, then when updating check the releases for changelogs.
|
||||
image: ghcr.io/sbondco/watcharr:latest
|
||||
container_name: watcharr
|
||||
ports:
|
||||
- 3080:3080
|
||||
volumes:
|
||||
# Contains all of watcharr data (database & cache)
|
||||
- ./data:/data
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
:::danger first account
|
||||
|
||||
When **first** running Watcharr, make sure only you have access. The first user created will become admin.
|
||||
|
||||
:::
|
||||
|
||||
You can now start `Watcharr` like so:
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
If you didn't change the ports in the example, the server will be available at [http://localhost:3080/](http://localhost:3080/).
|
||||
|
||||
## Updating
|
||||
|
||||
:::danger Take care
|
||||
|
||||
We try taking care as to not release breaking changes, however it is still recommended that
|
||||
you lookover changelogs before updating!
|
||||
|
||||
Breaking changes are marked at the top of releases: https://github.com/sbondCo/Watcharr/releases
|
||||
|
||||
:::
|
||||
|
||||
Updating your server can be done in two steps:
|
||||
|
||||
1. Update the `image` version in your `docker-compose.yml` file.
|
||||
Skip this step if you are using the `latest` tag.
|
||||
|
||||
```yaml
|
||||
# eg. update v1.19.0 to v1.20.0 (or whatever version you are updating to)
|
||||
image: ghcr.io/sbondco/watcharr:v1.19.0
|
||||
```
|
||||
|
||||
2. Pull the new changes and re-create your container:
|
||||
|
||||
```bash
|
||||
docker compose pull && docker compose down && docker compose up -d
|
||||
```
|
||||
|
||||
And that is it!
|
||||
@@ -1,74 +0,0 @@
|
||||
---
|
||||
sidebar_position: 10
|
||||
---
|
||||
|
||||
# From Source
|
||||
|
||||
## Installing
|
||||
|
||||
1. Get the code
|
||||
|
||||
```bash
|
||||
git clone https://github.com/sbondCo/Watcharr.git && \
|
||||
cd Watcharr
|
||||
```
|
||||
|
||||
If you want a specific version, checkout a version tag (replace `<tag>` with the tag):
|
||||
|
||||
```bash
|
||||
git checkout <tag>
|
||||
```
|
||||
|
||||
2. Build the frontend
|
||||
|
||||
The server will use the built files, so we move them to the `ui` folder, besides where it's binary will be built.
|
||||
|
||||
```bash
|
||||
npm i && \
|
||||
npm run build && \
|
||||
mv ./build ./server/ui
|
||||
```
|
||||
|
||||
3. Build the server
|
||||
|
||||
```bash
|
||||
cd server && \
|
||||
go mod download && \
|
||||
GOOS=linux go build -o ./watcharr
|
||||
```
|
||||
|
||||
4. Run the server
|
||||
|
||||
:::danger first account
|
||||
|
||||
When **first** running Watcharr, make sure only you have access. The first user created will become admin.
|
||||
|
||||
:::
|
||||
|
||||
```bash
|
||||
./watcharr
|
||||
```
|
||||
|
||||
5. Visit [http://localhost:3080/](http://localhost:3080/) and setup Watcharr.
|
||||
|
||||
## Updating
|
||||
|
||||
:::danger Take care
|
||||
|
||||
We try taking care as to not release breaking changes, however it is still recommended that
|
||||
you lookover changelogs before updating!
|
||||
|
||||
Breaking changes are marked at the top of releases: https://github.com/sbondCo/Watcharr/releases
|
||||
|
||||
:::
|
||||
|
||||
Updating is the same as installing except:
|
||||
|
||||
1. Cleanup old build. Delete the `ui` folder and the `watcharr` binary.
|
||||
2. Replace step one with getting the new code:
|
||||
|
||||
```bash
|
||||
git pull
|
||||
```
|
||||
|
||||
If you checked out a tag, update to the new tag as well.
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Introduction
|
||||
|
||||
Watcharr is for the peeps who like to keep a list of all the content they have ever watched.
|
||||
|
||||
If you would like more insight, the [adding to your watchlist guide](/docs/usage/adding-to-watchlist)
|
||||
is a great example of how Watcharr is used.
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"label": "Server Configuration",
|
||||
"position": 2,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Learn how to configure your server."
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Games Support (via IGDB/Twitch)
|
||||
|
||||
## Overview
|
||||
|
||||
Game support in Watcharr, currently, must be enabled by you.
|
||||
|
||||
This involves setting up a Twitch developer account (phone number needed for 2FA which is required) and entering application credentials into Watcharr, that can then be used for looking up game info via IGDB.
|
||||
|
||||
P.S. These steps are stolen from [igdb api docs](https://api-docs.igdb.com/#account-creation), I've tried to make it easier to follow with screenshots.
|
||||
|
||||
## Steps
|
||||
|
||||
### Setup On Twitch
|
||||
|
||||
1. Sign up for a [Twitch](https://dev.twitch.tv/login) account.
|
||||
Click login with twitch, then create an account in the Sign Up tab.
|
||||
2. Enable two factor authentication in your [account Security settings](https://www.twitch.tv/settings/security) (currently requires a phone number).
|
||||
3. [Register a new Application in the Twitch Developer Console](https://dev.twitch.tv/console/apps/create).
|
||||
These settings will do (name can be anything, we don't use OAuth, but a redirect url is required; localhost will do):
|
||||
|
||||

|
||||
|
||||
4. [Click manage](https://dev.twitch.tv/console/apps) on your newly created application.
|
||||
5. Click 'New Secret' to generate a new Client Secret.
|
||||
6. Take a note of your Client ID and new Client Secret (by leaving this tab open, until we are ready to copy the values into Watcharr).
|
||||
|
||||
### Setup On Watcharr
|
||||
|
||||
1. Login to Watcharr with an Admin account and navigate to server settings.
|
||||
|
||||

|
||||
|
||||
2. Scroll down and click on the Twitch service.
|
||||
|
||||

|
||||
|
||||
3. Enter your Client ID and Client Secret (from Twitch Application page, step 6 on twitch setup steps)
|
||||
|
||||

|
||||
|
||||
4. Click save, and start searching for your favourite games!
|
||||
|
||||

|
||||
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 8.2 KiB |
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"label": "Usage",
|
||||
"position": 3,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Hopefully Watcharr is easy enough to get started with and use, but incase you are stuck, one of these usage guides may help."
|
||||
}
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Adding To Your Watchlist
|
||||
|
||||
Adding movies or shows to your watchlist is the core feature of Watcharr.
|
||||
|
||||
The homepage is where your list will appear once you have added some.
|
||||
|
||||
To get started, you can follow along with these steps to add your first movie/show:
|
||||
|
||||
1. Search for the content:
|
||||
|
||||

|
||||
|
||||
2. Hover or click on the content you want to add:
|
||||
|
||||

|
||||
|
||||
3. Clicking the + (Plus) icon will let you give the content a status.
|
||||
|
||||
Currently supported statuses include: `Finished`, `Watching`, `Held`, `Planned`, `Dropped`.
|
||||
|
||||

|
||||
|
||||
4. Rate the content.
|
||||
|
||||

|
||||
|
||||
If you prefer, you can also do this by clicking/tapping on the active poster again.
|
||||
This will take you to the contents full page. Here you can see all the options, including
|
||||
adding `Thoughts` for the content.
|
||||
|
||||

|
||||
|
||||
`Thoughts` can be anything you would like to write down or remember about the specific movie/show.
|
||||
For example, sometimes I like to write something specific that I _really_ liked about the content,
|
||||
or for some shows, I write down my favourite seasons and how many times I have watched them.
|
||||
@@ -1,110 +0,0 @@
|
||||
// @ts-check
|
||||
// Note: type annotations allow type checking and IDEs autocompletion
|
||||
|
||||
const { themes } = require("prism-react-renderer");
|
||||
const lightTheme = themes.github;
|
||||
const darkTheme = themes.dracula;
|
||||
|
||||
/** @type {import('@docusaurus/types').Config} */
|
||||
const config = {
|
||||
title: "Watcharr Docs",
|
||||
tagline:
|
||||
"Open source, self-hostable watched list for all your content with user authentication, modern and clean UI and a very simple setup. ",
|
||||
favicon: "img/favicon.png",
|
||||
|
||||
// Set the production url of your site here
|
||||
url: "https://watcharr.app",
|
||||
// Set the /<baseUrl>/ pathname under which your site is served
|
||||
// For GitHub pages deployment, it is often '/<projectName>/'
|
||||
baseUrl: "/",
|
||||
|
||||
// GitHub pages deployment config.
|
||||
// If you aren't using GitHub pages, you don't need these.
|
||||
organizationName: "sbondCo", // Usually your GitHub org/user name.
|
||||
projectName: "Watcharr", // Usually your repo name.
|
||||
|
||||
onBrokenLinks: "throw",
|
||||
onBrokenMarkdownLinks: "warn",
|
||||
|
||||
trailingSlash: false,
|
||||
|
||||
// Even if you don't use internalization, you can use this field to set useful
|
||||
// metadata like html lang. For example, if your site is Chinese, you may want
|
||||
// to replace "en" with "zh-Hans".
|
||||
i18n: {
|
||||
defaultLocale: "en",
|
||||
locales: ["en"]
|
||||
},
|
||||
|
||||
presets: [
|
||||
[
|
||||
"classic",
|
||||
/** @type {import('@docusaurus/preset-classic').Options} */
|
||||
({
|
||||
docs: {
|
||||
sidebarPath: require.resolve("./sidebars.js"),
|
||||
// Please change this to your repo.
|
||||
// Remove this to remove the "edit this page" links.
|
||||
editUrl: "https://github.com/sbondCo/Watcharr/tree/dev/doc"
|
||||
},
|
||||
blog: {
|
||||
showReadingTime: true,
|
||||
// Please change this to your repo.
|
||||
// Remove this to remove the "edit this page" links.
|
||||
editUrl: "https://github.com/sbondCo/Watcharr/tree/dev/doc"
|
||||
},
|
||||
theme: {
|
||||
customCss: [
|
||||
"./node_modules/viewerjs/dist/viewer.css",
|
||||
require.resolve("./src/css/custom.css")
|
||||
]
|
||||
}
|
||||
})
|
||||
]
|
||||
],
|
||||
|
||||
themeConfig:
|
||||
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
|
||||
({
|
||||
image: "img/social-card.png",
|
||||
navbar: {
|
||||
title: "Watcharr",
|
||||
logo: {
|
||||
alt: "Watcharr Logo",
|
||||
src: "img/favicon.png"
|
||||
},
|
||||
items: [
|
||||
{
|
||||
type: "docSidebar",
|
||||
sidebarId: "tutorialSidebar",
|
||||
position: "left",
|
||||
label: "Docs"
|
||||
},
|
||||
{
|
||||
type: "docsVersionDropdown"
|
||||
},
|
||||
{
|
||||
href: "https://beta.watcharr.app",
|
||||
label: "Demo",
|
||||
position: "right"
|
||||
},
|
||||
{
|
||||
href: "https://github.com/sbondCo/Watcharr",
|
||||
label: "GitHub",
|
||||
position: "right"
|
||||
}
|
||||
]
|
||||
},
|
||||
prism: {
|
||||
theme: lightTheme,
|
||||
darkTheme: darkTheme
|
||||
},
|
||||
colorMode: {
|
||||
defaultMode: "light",
|
||||
// Dark theme currently disabled.. no time to fix the icons etc.
|
||||
disableSwitch: true
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
module.exports = config;
|
||||
@@ -1,44 +0,0 @@
|
||||
{
|
||||
"name": "watcharr-doc",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"docusaurus": "docusaurus",
|
||||
"start": "docusaurus start",
|
||||
"build": "docusaurus build",
|
||||
"swizzle": "docusaurus swizzle",
|
||||
"deploy": "docusaurus deploy",
|
||||
"clear": "docusaurus clear",
|
||||
"serve": "docusaurus serve",
|
||||
"write-translations": "docusaurus write-translations",
|
||||
"write-heading-ids": "docusaurus write-heading-ids"
|
||||
},
|
||||
"dependencies": {
|
||||
"@docusaurus/core": "3.1.1",
|
||||
"@docusaurus/preset-classic": "3.1.1",
|
||||
"@mdx-js/react": "^3.0.0",
|
||||
"clsx": "^2.1.0",
|
||||
"prism-react-renderer": "^2.3.1",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"viewerjs": "^1.11.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@docusaurus/module-type-aliases": "3.1.1"
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.5%",
|
||||
"not dead",
|
||||
"not op_mini all"
|
||||
],
|
||||
"development": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version",
|
||||
"last 1 safari version"
|
||||
]
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0"
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
/**
|
||||
* Creating a sidebar enables you to:
|
||||
- create an ordered group of docs
|
||||
- render a sidebar for each doc of that group
|
||||
- provide next/previous navigation
|
||||
|
||||
The sidebars can be generated from the filesystem, or explicitly defined here.
|
||||
|
||||
Create as many sidebars as you want.
|
||||
*/
|
||||
|
||||
// @ts-check
|
||||
|
||||
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
|
||||
const sidebars = {
|
||||
// By default, Docusaurus generates a sidebar from the docs folder structure
|
||||
tutorialSidebar: [{ type: "autogenerated", dirName: "." }]
|
||||
|
||||
// But you can create a sidebar manually
|
||||
/*
|
||||
tutorialSidebar: [
|
||||
'intro',
|
||||
'hello',
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Tutorial',
|
||||
items: ['tutorial-basics/create-a-document'],
|
||||
},
|
||||
],
|
||||
*/
|
||||
};
|
||||
|
||||
module.exports = sidebars;
|
||||
@@ -1,61 +0,0 @@
|
||||
import React from "react";
|
||||
import clsx from "clsx";
|
||||
import styles from "./styles.module.css";
|
||||
|
||||
const FeatureList = [
|
||||
{
|
||||
title: "Free and Open",
|
||||
Svg: require("@site/static/img/icon/code-slash.svg").default,
|
||||
description: (
|
||||
<>
|
||||
Watcharr is free and open source software distributed under the MIT license. Feel free to
|
||||
browse, modify or contribute!
|
||||
</>
|
||||
)
|
||||
},
|
||||
{
|
||||
title: "Simple",
|
||||
Svg: require("@site/static/img/icon/happy.svg").default,
|
||||
description: (
|
||||
<>
|
||||
Watcharr is incredibly easy to dive into. Install without hassle and get started with the
|
||||
seamless and intuitive user experience.
|
||||
</>
|
||||
)
|
||||
},
|
||||
{
|
||||
title: "Built With Go and Svelte",
|
||||
Svg: require("@site/static/img/icon/go.svg").default,
|
||||
description: (
|
||||
<>Don't know what else to add here, so now you know Watcharr is built with Go and Svelte.</>
|
||||
)
|
||||
}
|
||||
];
|
||||
|
||||
function Feature({ Svg, title, description }) {
|
||||
return (
|
||||
<div className={clsx("col col--4")}>
|
||||
<div className="text--center">
|
||||
<Svg className={styles.featureSvg} role="img" />
|
||||
</div>
|
||||
<div className="text--center padding-horiz--md">
|
||||
<h3>{title}</h3>
|
||||
<p>{description}</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default function HomepageFeatures() {
|
||||
return (
|
||||
<section className={styles.features}>
|
||||
<div className="container">
|
||||
<div className="row">
|
||||
{FeatureList.map((props, idx) => (
|
||||
<Feature key={idx} {...props} />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
.features {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 2rem 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.featureSvg {
|
||||
height: 200px;
|
||||
width: 200px;
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
import React, { useEffect } from "react";
|
||||
import styles from "./styles.module.css";
|
||||
import clsx from "clsx";
|
||||
import Viewer from "viewerjs";
|
||||
|
||||
function TwoColFeat({ title, description, imgSrc }) {
|
||||
return (
|
||||
<div className={clsx(styles.twoCol)}>
|
||||
<div>
|
||||
<h2>{title}</h2>
|
||||
<p>{description}</p>
|
||||
</div>
|
||||
<div>
|
||||
<img src={imgSrc} alt="" loading="lazy" />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export function HomepageTwoColFeats() {
|
||||
useEffect(() => {
|
||||
const ctr = document.getElementById("homepage-two-col-feats");
|
||||
console.debug("Starting image viewer", ctr);
|
||||
new Viewer(ctr, {
|
||||
navbar: 0,
|
||||
toolbar: {
|
||||
zoomIn: 2,
|
||||
zoomOut: 2,
|
||||
next: 2,
|
||||
prev: 2
|
||||
},
|
||||
title: 0,
|
||||
className: "twoColViewer"
|
||||
});
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<section id="homepage-two-col-feats" className={styles.twoColFeats}>
|
||||
<TwoColFeat
|
||||
title="Neat UI"
|
||||
description="We just look lightweight."
|
||||
imgSrc="https://github.com/sbondCo/Watcharr/raw/dev/screenshot/homepage.png"
|
||||
/>
|
||||
<TwoColFeat
|
||||
title="Easy To Use"
|
||||
description="Not much to it, other than ease of use."
|
||||
imgSrc="https://github.com/sbondCo/Watcharr/raw/dev/screenshot/homepage-poster-change-status.png"
|
||||
/>
|
||||
<TwoColFeat
|
||||
title="In-Depth Details"
|
||||
description="About your favourite content."
|
||||
imgSrc="https://github.com/sbondCo/Watcharr/raw/dev/screenshot/content-details-page.png"
|
||||
/>
|
||||
<TwoColFeat
|
||||
title="Personal Stats and Configuration"
|
||||
description="Make it how you like."
|
||||
imgSrc="https://github.com/sbondCo/Watcharr/raw/dev/screenshot/user-profile.png"
|
||||
/>
|
||||
<TwoColFeat
|
||||
title="Discovery"
|
||||
description="Find the latest trending content."
|
||||
imgSrc="https://github.com/sbondCo/Watcharr/raw/dev/screenshot/discover-page.png"
|
||||
/>
|
||||
<TwoColFeat
|
||||
title="Dark Theme"
|
||||
description="For you who are still unsatisfied. ;("
|
||||
imgSrc="https://github.com/sbondCo/Watcharr/raw/dev/screenshot/content-details-page-dark.png"
|
||||
/>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
.twoColFeats {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
flex-flow: column;
|
||||
width: 100%;
|
||||
max-width: 1300px;
|
||||
}
|
||||
|
||||
.twoCol {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
width: 100%;
|
||||
padding: 2.5rem 5rem;
|
||||
gap: 50px;
|
||||
background-color: rgb(236, 236, 236);
|
||||
}
|
||||
|
||||
.twoCol:nth-child(even) {
|
||||
flex-flow: row-reverse;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.twoCol > div {
|
||||
width: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-flow: column;
|
||||
}
|
||||
|
||||
.twoCol > div > img {
|
||||
width: 100%;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0px 0px 5px rgb(121, 121, 121);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 850px) {
|
||||
.twoCol,
|
||||
.twoCol:nth-child(even) {
|
||||
flex-flow: column;
|
||||
}
|
||||
|
||||
.twoCol > div {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.twoCol > div > img {
|
||||
max-width: 500px;
|
||||
}
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
/**
|
||||
* Any CSS included here will be global. The classic template
|
||||
* bundles Infima by default. Infima is a CSS framework designed to
|
||||
* work well for content-centric websites.
|
||||
*/
|
||||
|
||||
/* You can override the default Infima variables here. */
|
||||
:root {
|
||||
--ifm-color-primary: #2e8555;
|
||||
--ifm-color-primary-dark: #29784c;
|
||||
--ifm-color-primary-darker: #277148;
|
||||
--ifm-color-primary-darkest: #205d3b;
|
||||
--ifm-color-primary-light: #33925d;
|
||||
--ifm-color-primary-lighter: #359962;
|
||||
--ifm-color-primary-lightest: #3cad6e;
|
||||
--ifm-code-font-size: 95%;
|
||||
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
/* For readability concerns, you should choose a lighter palette in dark mode. */
|
||||
[data-theme="dark"] {
|
||||
--ifm-color-primary: #25c2a0;
|
||||
--ifm-color-primary-dark: #21af90;
|
||||
--ifm-color-primary-darker: #1fa588;
|
||||
--ifm-color-primary-darkest: #1a8870;
|
||||
--ifm-color-primary-light: #29d5b0;
|
||||
--ifm-color-primary-lighter: #32d8b4;
|
||||
--ifm-color-primary-lightest: #4fddbf;
|
||||
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.twoColViewer .viewer-close {
|
||||
right: 10px;
|
||||
top: 10px;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
/* Stupid poopin fix for viewerjs because whatever is bundling the css
|
||||
isn't keeping the order of this correctly. All this time wasted and it
|
||||
was just opaque ;( BUT ONLY IN THE BUILD AAAAAAAAAAAAAAAAAAAAAA */
|
||||
.viewer-in {
|
||||
opacity: 1 !important;
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
import React from "react";
|
||||
import Link from "@docusaurus/Link";
|
||||
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
|
||||
import Layout from "@theme/Layout";
|
||||
import HomepageFeatures from "@site/src/components/HomepageFeatures";
|
||||
import LogoCol from "@site/static/img/logo-col.png";
|
||||
|
||||
import styles from "./index.module.css";
|
||||
import clsx from "clsx";
|
||||
import { HomepageTwoColFeats } from "../components/TwoColFeat";
|
||||
|
||||
function HomepageHeader() {
|
||||
const { siteConfig } = useDocusaurusContext();
|
||||
return (
|
||||
<header className="hero shadow--lw">
|
||||
<div className={styles.heroContainer}>
|
||||
<div className={styles.heroWrapper}>
|
||||
<img src={LogoCol} />
|
||||
<h1 className="hero__title">{siteConfig.title}</h1>
|
||||
<p className="hero__subtitle">{siteConfig.tagline}</p>
|
||||
<div className={styles.buttons}>
|
||||
<Link className="button button--secondary button--lg" to="/docs/introduction">
|
||||
Get Started
|
||||
</Link>
|
||||
<Link
|
||||
className="button button--secondary button--outline button--lg"
|
||||
to="https://beta.watcharr.app"
|
||||
target="_blank"
|
||||
>
|
||||
Demo
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
);
|
||||
}
|
||||
|
||||
export default function Home() {
|
||||
const { siteConfig } = useDocusaurusContext();
|
||||
return (
|
||||
<Layout
|
||||
title={`${siteConfig.title}`}
|
||||
description="Description will go into a meta tag in <head />"
|
||||
>
|
||||
<HomepageHeader />
|
||||
<main>
|
||||
<HomepageFeatures />
|
||||
<HomepageTwoColFeats />
|
||||
</main>
|
||||
</Layout>
|
||||
);
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
/**
|
||||
* CSS files with the .module.css suffix will be treated as CSS modules
|
||||
* and scoped locally.
|
||||
*/
|
||||
|
||||
.heroContainer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.heroWrapper {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-flow: column;
|
||||
max-width: 600px;
|
||||
padding-left: 2rem;
|
||||
padding-right: 2rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.heroWrapper img {
|
||||
width: 30vh;
|
||||
max-width: 250px;
|
||||
}
|
||||
|
||||
.buttons {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 10px;
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
title: Markdown page example
|
||||
---
|
||||
|
||||
# Markdown page example
|
||||
|
||||
You don't need React to write simple standalone pages.
|
||||
@@ -1,13 +0,0 @@
|
||||
version: "3"
|
||||
|
||||
# To test prod
|
||||
services:
|
||||
watcharr:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
container_name: watcharr
|
||||
ports:
|
||||
- 3080:3080
|
||||
volumes:
|
||||
- ./container_data:/data
|
||||
@@ -1,14 +0,0 @@
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
watcharr:
|
||||
# The :latest tag is used for simplicity, it is recommended
|
||||
# to use an actual version, then when updating check the releases for changelogs.
|
||||
image: ghcr.io/sbondco/watcharr:latest
|
||||
container_name: watcharr
|
||||
ports:
|
||||
- 3080:3080
|
||||
volumes:
|
||||
# Contains all of watcharr data (database & cache)
|
||||
- ./data:/data
|
||||
restart: unless-stopped
|
||||