myspoti
Jetpack Compose로 만든 Spotify 전용 안드로이드 클라이언트
기분·선호·시간을 입력하면 Mimir가 영화·TV·책·게임·음악을 추천하고 이유를 알려줍니다
Describe a mood, a favourite or a time limit; Mimir finds films, TV, books, games and music that fit, with the reason for every pick.
미디어Python · PHPGitHub @RedZero13온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Find what to watch, read, play or listen to next. Mimir is a free catalogue and discovery engine for films, TV series, books and manga, games, music and YouTube, built by Terratales Media Entertainment. Live at mimir.terratalesmedia.world.
Describe what you want to experience: a mood, an idea, a favourite work, a time limit. Mimir returns a few well-chosen picks, each with the reasons it fits. The catalogue holds about 11,000 works from 101 countries in 68 original languages; 681 are fully classified against 372 controlled terms (233 of them subgenres), and the rest, imported from Wikidata, are being classified in batches.
Under the hood, a request in plain language is interpreted into inspectable constraints and preferences, a classified catalogue is ranked against them, and every result is explained from recorded evidence. Facts are labelled separately from interpretations. There is no LLM and no API key.
It is also a browsable catalogue, in the spirit of IMDb, MyAnimeList and Goodreads in one place: directories per medium, 36 shelves, subgenres, tag and people pages, a parents' guide for every medium, "where to watch" links, a personal library with activity rings and badges, shareable lists, watch-alongs and a community.
Ways to tell Mimir your taste, besides rating works: swipe through a deck (right like, up love, left not for me), spin a mood when you have no time to browse, craft hybrids by combining works, moods and genres, and open Days of the year (World Laughter Day, International Music Day and about 50 more) for something new and picks from your own profile. Franchise pages gather a whole IP (James Bond, Middle-earth, the Marvel Cinematic Universe, the Wizarding World) with a row per medium, and films and series list their lead cast. One click in your profile resets your recommendations.
docs/FEATURES.mddocs/press/docs/SEO-KEYWORD-STRATEGY.md (keywords, meta map, what is built and what is not).docs/CATALOGUE-EXPANSION.md · Planned features: docs/FUTURE-FEATURES.mddocs/BETA.mddocs/COMPETITIVE.md · What comes next: docs/ROADMAP.mdapi/ Python 3.11+, FastAPI, PostgreSQL (modular monolith)
mde/migrations/ SQL migrations, applied in order, additive only
mde/taxonomy/ Controlled taxonomy (taxonomy.json) + loader/validator
mde/seed/ Editorial seed: catalogue.json (the pilot, with defaults) plus films, series, books, games,
albums, food, YouTube and more (*.json), merged by catalogue/seedfiles.py
mde/data/enrichment/ Open-data enrichment written by `python -m mde ingest` (Wikidata, Open Library, MusicBrainz)
mde/ingest/ Connectors, matching rules and the HTTP cache
mde/catalogue/ Import (load.py) and read-side queries (repository.py)
mde/discovery/ intent.py → rank.py → explain.py, orchestrated by engine.py
mde/app.py HTTP API
benchmark/ Discovery benchmark (queries.json) and runner
tests/ Unit tests + integration tests against a throwaway database
web/ Next.js 15 + TypeScript (server components; no client-side API calls)
brand/ Mimir mark, lockups, icons and social card (see docs/BRAND.md)
demo/ The public single-page site: a JavaScript port of the pure pipeline (engine.cjs),
kept identical to the Python by api/tests/test_demo_parity.py
node demo/build.cjs --site writes demo/dist/site/, the deployable static site for
mimir.terratalesmedia.world, with a full <head>, icons, social card and CNAME. .github/workflows/pages.yml
publishes it on every push to main (setup in docs/DEPLOY.md). node demo/build.cjs alone writes a single
self-contained page that runs the discovery
pipeline (intent parsing, ranking, explanations) on the pilot catalogue with no server. Differences from the
full stack: keyword search is a simple word match instead of PostgreSQL full-text search, and feedback stays in
the viewer's browser. pytest runs the JavaScript and Python engines side by side on every benchmark query plus
about 40 edge cases, and fails if their output differs in any field.
Requirements: Python 3.11+, Node 22, PostgreSQL 16.
# 1. Database
createdb mde # or any database; set DATABASE_URL accordingly
# 2. API
cd api
python -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"
export DATABASE_URL=postgresql://postgres:postgres@localhost:5432/mde
python -m mde setup # apply migrations + import the pilot catalogue (safe to re-run)
uvicorn mde.app:app --port 8000
# 3. Web (another terminal)
cd web
npm ci
API_URL=http://localhost:8000 npm run dev # http://localhost:3000
Try it from the command line too:
python -m mde discover "a book like Outer Wilds"
python -m mde benchmark
| Variable | Used by | Default | Purpose |
|---|---|---|---|
DATABASE_URL | api | postgresql://postgres:postgres@localhost:5432/mde | Catalogue database |
CORS_ORIGINS | api | http://localhost:3000 | Comma-separated browser origins (the web app calls the API server-side, so this only matters for direct browser use) |
API_URL | web | http://localhost:8000 | Where the web server reaches the API |
TEST_DATABASE_ADMIN_URL | tests | postgresql://postgres:postgres@localhost:5432/postgres | Tests create and drop their own database through this connection |
No API keys are needed. Discovery uses no external providers and no LLM.
cd api && ruff check . && pytest -q # DB tests skip without PostgreSQL, parity tests without Node
cd web && npm run typecheck && npm run build
CI (.github/workflows/ci.yml) runs the same checks against a PostgreSQL 16 service.
| Method | Path | |
|---|---|---|
| GET | /api/discover?q=…&limit=8 | Interpretation, ranked results with reasons, caveats and score breakdowns, and the exclusion counts. Logs an anonymous discovery event |
| GET | /api/works?medium=&tag=&avoid=&decade=&language=&country=&max_minutes=&q=&sort= | Browse: filtered, sorted work cards plus facet counts. tag and avoid take taxonomy keys and repeat; avoid keeps works assessed as none or mild |
| GET | /api/works/{slug} | Work page: facts, credits, tags by dimension, parents' guide (official ratings plus per-category severity and notes), connected works, provenance, sources |
| GET | /api/tags, /api/tags/{dimension}/{slug} | Tag index with counts; a tag's definition, its works (strongest first) and related tags |
| GET | /api/people, /api/people/{slug} | Everyone credited; a person's or studio's works, roles and recurring qualities |
| GET | /api/works/{slug}/where?region=IN | Where to watch, listen, read or play: a link per service for that region (search links unless the catalogue holds an exact ID) |
| GET | /api/shelves, /api/shelves/{slug} | Wordplay shelves (Laugh Riot, Drama Mamas, Nepo Babies, Desi Delights …) |
| GET | /api/groups, /api/groups/{slug} | Series and franchise families, in order, with total time |
| GET | /api/music/moods, /api/music/remixes | Mood rings and the remix rack |
| POST | /api/recommend | {ratings: {slug: loved|liked|disliked}, limit, medium} → taste profile and picks, each with the work it resembles and the qualities it shares |
| GET | /api/taxonomy | The controlled vocabulary |
| POST | /api/feedback | {event_id, work_slug, kind} where kind is one of relevant, irrelevant, too_long, wrong_mood, , , |
Accounts are an encrypted vault keyed by a recovery key, stored by the Mimir Vault WordPress plugin (wordpress/mimir-vault/, see docs/ACCOUNTS.md); the browser code is demo/vault.cjs.
Community (mde/community.py; clients send Authorization: Bearer <token>):
| Method | Path | |
|---|---|---|
| POST | /api/auth/signup, /api/auth/login, /api/auth/logout | Accounts. Passwords hashed with scrypt; only a SHA-256 of each session token is stored; sign-in is rate-limited |
| GET, PATCH | /api/me | Profile, privacy (private profile, share activity) |
| POST | /api/me/delete | Deletes the account and everything it wrote |
| GET, PUT | /api/me/state | The private library (statuses, scores, progress, lists, journal, challenges), synced as one document |
| GET | /api/users/{username} | Profile: counts, recent reviews, public lists, activity (followers only when private) |
| POST, DELETE | /api/users/{username}/follow | Follow and unfollow |
| GET, PUT, DELETE | /api/works/{slug}/reviews, /api/works/{slug}/review | Reviews with a community score; one review per person per work |
| POST, DELETE | /api/reviews/{id}/like; GET, POST /api/reviews/{id}/comments; DELETE /api/comments/{id} | Likes and comments |
| POST | /api/activity | "started" / "finished", shared with followers when the user allows |
| GET | /api/feed, /api/community | Your feed; trending works, latest reviews and activity, challenge counts |
| POST, GET, DELETE | /api/lists, /api/lists/{id} | Published lists |
| GET, POST, DELETE, PUT | /api/challenges/{slug}/{year} (/join, /progress) | Social-calendar challenges: members, leaders, your ticked days |
| POST | /api/reports | Report a review, comment, user or list |
IntentParser interface.MIMIR_API_URL for the Pages build; see docs/DEPLOY.md).Copyright © 2026 Terratales Media Entertainment Private Limited. All rights reserved; see LICENSE.
Third-party fonts and open data keep their own licences, listed in NOTICE.md.
docs/DEPLOY.mddocs/ASSESSMENT.mddocs/TAXONOMY.mddocs/SOURCES.mdalready_experiencednot_what_i_meantwill_try| GET | /api/health |