├── server ├── static │ └── .gitkeep └── src │ ├── tests │ ├── __init__.py │ ├── unit │ │ ├── __init__.py │ │ └── test_discovarr_prompt.py │ ├── integration │ │ ├── __init__.py │ │ ├── test_jellyfin_provider.py │ │ ├── test_plex_provider.py │ │ ├── test_openai_provider.py │ │ ├── test_ollama_provider.py │ │ ├── test_gemini_provider.py │ │ ├── test_settings.py │ │ ├── base │ │ │ ├── base_live_request_provider_tests.py │ │ │ └── base_live_library_provider_tests.py │ │ ├── test_postgres.py │ │ ├── test_trakt_provider.py │ │ ├── test_radarr_provider.py │ │ └── test_sonarr_provider.py │ ├── requirements.txt │ └── README.md │ ├── providers │ ├── __init__.py │ ├── radarr.py │ └── sonarr.py │ ├── services │ ├── __init__.py │ ├── migrations │ │ ├── 006_search.py │ │ ├── 013_settings.py │ │ ├── 012_watchhistory.py │ │ ├── 009_watchhistory.py │ │ ├── 007_search.py │ │ ├── 010_watchhistory.py │ │ ├── 004_media.py │ │ ├── 005_search.py │ │ ├── 011_poster_url_source.py │ │ ├── 008_watchhistory.py │ │ ├── 003_searchstat.py │ │ ├── 016_media_favorite.py │ │ ├── 015_media_source_provider.py │ │ ├── 002_media.py │ │ ├── 018_llmstat.py │ │ ├── __init__.py │ │ ├── 001_media.py │ │ └── 014_media_entity_type.py │ ├── response.py │ ├── tmdb.py │ ├── image_cache.py │ ├── api.py │ └── scheduler.py │ ├── requirements.txt │ ├── env.example.sh │ └── base │ ├── library_provider_base.py │ └── llm_provider_base.py ├── CONTRIBUTE.md ├── client ├── src │ ├── assets │ │ └── main.css │ ├── config.js │ ├── main.js │ ├── stores │ │ ├── movie.js │ │ ├── searchStore.js │ │ ├── toast.js │ │ └── settings.js │ ├── router │ │ └── index.js │ ├── components │ │ ├── GlobalToast.vue │ │ ├── Markdown.vue │ │ ├── EditMediaNameModal.vue │ │ ├── ExamplePrompts.vue │ │ ├── RequestModal.vue │ │ └── VideoCarousel.vue │ ├── App.vue │ └── views │ │ └── WatchHistoryView.vue ├── public │ ├── logo.png │ ├── logo1.png │ ├── logo2.png │ ├── logo3.png │ ├── aiarr_favicon.png │ └── placeholder-image.jpg ├── postcss.config.js ├── index.html ├── tailwind.config.js ├── vite.config.js └── package.json ├── .assets ├── home_page.png ├── search_page.png └── settings_page.png ├── .dockerignore ├── .vscode └── extensions.json ├── scripts ├── movies.csv └── import_watch_history.py ├── compose.example.yml ├── .gitignore ├── MIGRATE.md ├── RELEASE.md ├── start-dev.sh ├── compose.example.env.yml ├── compose.example.qa.yml ├── compose.example.dev.yml ├── Dockerfile.dev ├── CHANGELOG.md ├── entrypoint.sh ├── .github └── workflows │ └── docker-publish.yml └── Dockerfile /server/static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/src/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/src/providers/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/src/services/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/src/tests/unit/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/src/tests/integration/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/src/tests/requirements.txt: -------------------------------------------------------------------------------- 1 | pytest 2 | pytest-asyncio -------------------------------------------------------------------------------- /CONTRIBUTE.md: -------------------------------------------------------------------------------- 1 | # Please submit PRs to the dev branch, thank you! -------------------------------------------------------------------------------- /client/src/assets/main.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /.assets/home_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqrlmstr5000/discovarr/HEAD/.assets/home_page.png -------------------------------------------------------------------------------- /client/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqrlmstr5000/discovarr/HEAD/client/public/logo.png -------------------------------------------------------------------------------- /.assets/search_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqrlmstr5000/discovarr/HEAD/.assets/search_page.png -------------------------------------------------------------------------------- /.assets/settings_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqrlmstr5000/discovarr/HEAD/.assets/settings_page.png -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__ 3 | **/__pycache__/ 4 | **/*.py[cod] -------------------------------------------------------------------------------- /client/public/logo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqrlmstr5000/discovarr/HEAD/client/public/logo1.png -------------------------------------------------------------------------------- /client/public/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqrlmstr5000/discovarr/HEAD/client/public/logo2.png -------------------------------------------------------------------------------- /client/public/logo3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqrlmstr5000/discovarr/HEAD/client/public/logo3.png -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /client/public/aiarr_favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqrlmstr5000/discovarr/HEAD/client/public/aiarr_favicon.png -------------------------------------------------------------------------------- /client/public/placeholder-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqrlmstr5000/discovarr/HEAD/client/public/placeholder-image.jpg -------------------------------------------------------------------------------- /client/src/config.js: -------------------------------------------------------------------------------- 1 | export const config = { 2 | apiUrl: import.meta.env.VITE_DISCOVARR_URL || "__API_ENDPOINT__" 3 | }; 4 | -------------------------------------------------------------------------------- /client/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /scripts/movies.csv: -------------------------------------------------------------------------------- 1 | title,watched_by,media_type 2 | "The Grand Budapest Hotel",test,movie 3 | "Pulp Fiction",test,movie 4 | "Interstellar",test,movie -------------------------------------------------------------------------------- /server/src/requirements.txt: -------------------------------------------------------------------------------- 1 | fastapi 2 | uvicorn[standard] 3 | requests 4 | google-genai 5 | openai 6 | APScheduler>=3.10.1 7 | peewee==3.18.* 8 | Jinja2 9 | plexapi 10 | ollama 11 | trakt.py 12 | aiohttp 13 | aiofiles 14 | psycopg2-binary 15 | #pgvector 16 | #sqlite-vec -------------------------------------------------------------------------------- /client/src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import { createPinia } from 'pinia' 3 | 4 | import 'animate.css'; 5 | 6 | import App from './App.vue' 7 | import router from './router' 8 | 9 | import './assets/main.css' 10 | 11 | const app = createApp(App) 12 | 13 | app.use(createPinia()) 14 | app.use(router) 15 | 16 | app.mount('#app') 17 | -------------------------------------------------------------------------------- /client/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 |{{ prompt.title }}
20 |{{ prompt.text }}
21 |
96 |
97 |
104 | Loading watch history...
137 |Oops! Something went wrong.
145 |Failed to load watch history: {{ error }}
146 |No Watch History Found
174 |Looks like there's nothing here yet. Start watching some media!
175 |