Movary is a self-hosted web application to track and rate your watched movies (like a digital movie diary). You can import/export your history and ratings from/to external sources like trakt.tv or letterboxd.com, track your watches automatically via plex and more.
Demo installation can be found here (login email testUser@movary.org
and password testUser
).
Please report all bugs, improvement suggestions or feature wishes by creating github issues or visit the official subreddit!
This project started because I wanted a self-hosted solution for tracking my watched movies and their ratings, so that I can really own my data and do not have to solely rely on other providers like letterboxd or trakt to keep it safe (or decide what to do with it).
Features:
- Movie tracking: Collect and manage your watch history and ratings
- Statistics: Overview over your movie watching behavior and history, like e.g. most watched actors/directors/genres/languages/years
- Third party support: Import your existing history and ratings from e.g. trakt.tv or letterboxd.com
- Plex scrobbler: Automatically add new plex watches and ratings (plex premium required)
- Own your personal data: Users can decide who can see their data and export/import/delete the data and their accounts at any time
- Locally stored metadata: Using e.g. themoviedb.org and imdb as sources, all metadata movary uses for your history entries can be stored locally
- PWA: Can be installed as an app (How to install PWAs in chrome)
- Completely free, no ads, no tracking and open source! :)
Movary has support for multiple users accounts in case you want to share your instance, but was designed with only a small number of accounts in mind.
Disclaimer: This project is still in an experimental (but imo completely usable) state. I am planning to add more and improve existing features before creating a 1.0 realease, which can lead to sudden breaking changes until then, so keep the release notes in mind when updating.
This is the preferred and currently only tested way to run the app.
You must provide a tmdb api key (get one here).
Example using MySQL (recommended):
$ docker volume create movary-storage
$ docker run --rm -d \
--name movary \
-p 80:80 \
-e TMDB_API_KEY="<tmdb_key>" \
-e DATABASE_MODE="mysql" \
-e DATABASE_MYSQL_HOST="<host>" \
-e DATABASE_MYSQL_NAME="<db_name>" \
-e DATABASE_MYSQL_USER="<db_user>" \
-e DATABASE_MYSQL_PASSWORD="<db_password>" \
-v movary-storage:/app/storage \
leepeuker/movary:latest
Example using SQLite:
$ docker volume create movary-storage
$ docker run --rm -d \
--name movary \
-p 80:80 \
-e TMDB_API_KEY="<tmdb_key>" \
-e DATABASE_MODE="sqlite" \
-v movary-storage:/app/storage \
leepeuker/movary:latest
Example docker-compose.yml with a MySQL server
version: "3.5"
services:
movary:
image: leepeuker/movary:latest
container_name: movary
ports:
- "80:80"
environment:
TMDB_API_KEY: "<tmdb_key>"
DATABASE_MODE: "mysql"
DATABASE_MYSQL_HOST: "mysql"
DATABASE_MYSQL_NAME: "movary"
DATABASE_MYSQL_USER: "movary_user"
DATABASE_MYSQL_PASSWORD: "movary_password"
volumes:
- movary-storage:/app/storage
mysql:
image: mysql:8.0
environment:
MYSQL_DATABASE: "movary"
MYSQL_USER: "movary_user"
MYSQL_PASSWORD: "movary_password"
MYSQL_ROOT_PASSWORD: "<mysql_root_password>"
volumes:
- movary-db:/var/lib/mysql
volumes:
movary-db:
movary-storage:
You can run movary commands in docker via e.g. docker exec movary php bin/console.php
- Execute missing database migrations:
php bin/console.php database:migration:migrate
(on initial installation and ideally after every update) - Create initial user
- via web UI by visiting the movary lading page for the first time
- via cli
php bin/console.php user:create email@example.com password username
It is recommended to enable tmdb image caching (set env variable TMDB_ENABLE_IMAGE_CACHING=1
).
### Enviroment
ENV=production
TIMEZONE="Europe/Berlin"
# Minimum number of seconds the job processing worker has to run => the smallest possible timeperiode between processing two jobs
MIN_RUNTIME_IN_SECONDS_FOR_JOB_PROCESSING=15
### Database
# Supported modes: sqlite or mysql
DATABASE_MODE=
DATABASE_SQLITE=storage/movary.sqlite
DATABASE_MYSQL_HOST=
DATABASE_MYSQL_PORT=3306
DATABASE_MYSQL_NAME=
DATABASE_MYSQL_USER=
DATABASE_MYSQL_PASSWORD=
DATABASE_MYSQL_CHARSET=utf8mb4
### TMDB
# Used for metda data collection, see: https://www.themoviedb.org/settings/api
TMDB_API_KEY=
# Save and deliver movie/person posters locally
TMDB_ENABLE_IMAGE_CACHING=0
### Logging
LOG_LEVEL=warning
LOG_ENABLE_STACKTRACE=0
LOG_ENABLE_FILE_LOGGING=0
More configuration can be done via the base image webdevops/php-nginx, checkout their docs for more.
Use php bin/console.php
to list all available cli commands
Update movie or person meta data with themoviedb.org information.
Make sure you have added the variables TMDB_API_KEY
to the environment.
Helpful commands:
php bin/console.php tmdb:movie:sync
-> Refresh local movie meta data
php bin/console.php tmdb:person:sync
-> Refresh local person meta data
Interesting flags:
--hours
Only update movies/persons which were last synced X hours or longer ago--threshold
Maximum number of movies/person to sync for this run
Enable by setting environment variable TMDB_ENABLE_IMAGE_CACHING
to 1
.
To e.g. prevent rate limit issues with the TMDB api you should cache tmdb images (movie/person posters) with movary.
This will store a local copy of the image in the storage
directory and serve this image instead of the original one from TMDB.
Make sure you persist the content of the storage
directory to keep data e.g. when restarting docker container.
Execute the cache refresh command regularly, e.g. via cronjob, to keep the cache up to date.
Helpful commands:
php bin/console.php tmdb:imageCache:refresh
-> Refresh local image cachephp bin/console.php tmdb:imageCache:delete
-> Delete locally cached images
Automatically track movies watched in plex with movary.
You can generate your plex webhook url on the plex settings page (/setting/plex
).
Add the generated url as a webhook to plex to start scrobbling!
You can select what you want movary to scrobble (movie views and/or ratings) via the "Scrobbler Options" checkboxes on the settings page.
You can import your watch history and ratings from trakt.tv (exporting from movary to trakt not supported yet).
The trakt account used in the import process must have a trakt username and client id set (can be set via settings page /settings/trakt
or via cli user:update
).
The import can be executed via the settings page /settings/trakt
or via cli.
Example cli import (import history and ratings for user with id 1 and overwrite locally existing data if needed):
php bin/console.php trakt:import --userId=1 --ratings --history --overwrite
Info: Importing hundreds or thousands of movies for the first time can take a few minutes.
Interesting flags:
--userId
User to import data to--ratings
Import trakt ratings--history
Import trakt watch history (plays)--overwrite
Use if you want to overwrite the local state with the trakt state (deletes and overwrites local data)--ignore-cache
Use if you want to force import everything regardless if there was a change since the last import
Coming soon (maybe?)
You can import your watch history and ratings from letterboxd.com.
Visit the movary settings page /settings/letterboxd
for more instructions
Info: Importing hundreds or thousands of movies for the first time can take a few minutes.
Sync ratings from imdb for local movies.
Example:
php bin/console.php imdb:sync
Flags:
--hours
Only sync movie ratings which were last synced at least X hours ago--threshold
Maximum number of movie ratings to sync
Clone the repository and follow these steps for a local development setup:
- run
cp .env.development.example .env
and edit the.env
file content - run
make build
to build the containers and set up the application - run
make up
to start the containers
The application should be up-to-date and running locally now.
- Trakt API docs: https://trakt.docs.apiary.io/
- TMDB API docs: https://developers.themoviedb.org/3
- Report bugs or request features via github issues
- Ask questions or discuss movary related topics in the official subreddit