{"id":46440819,"url":"https://github.com/deuxksy/meridian-x","last_synced_at":"2026-06-27T05:00:32.612Z","repository":{"id":332060137,"uuid":"1132254929","full_name":"deuxksy/Meridian-X","owner":"deuxksy","description":"소중한 미디어 컬렉션을 완벽하게 관리하는 품격 있는 자동화 큐레이션 솔루션.","archived":false,"fork":false,"pushed_at":"2026-06-27T04:08:06.000Z","size":228,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-27T04:08:42.335Z","etag":null,"topics":["automation","curation","dlna","media-organizer","meridian-x","python"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deuxksy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-11T16:12:11.000Z","updated_at":"2026-06-27T04:08:10.000Z","dependencies_parsed_at":null,"dependency_job_id":"e0597303-44c8-4be6-816b-2d7bbde73b6f","html_url":"https://github.com/deuxksy/Meridian-X","commit_stats":null,"previous_names":["deuxksy/meridian-x"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/deuxksy/Meridian-X","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deuxksy%2FMeridian-X","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deuxksy%2FMeridian-X/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deuxksy%2FMeridian-X/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deuxksy%2FMeridian-X/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deuxksy","download_url":"https://codeload.github.com/deuxksy/Meridian-X/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deuxksy%2FMeridian-X/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34841990,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","curation","dlna","media-organizer","meridian-x","python"],"created_at":"2026-03-05T21:56:16.648Z","updated_at":"2026-06-27T05:00:32.606Z","avatar_url":"https://github.com/deuxksy.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Meridian-X\n\n[![Security Scan](https://github.com/deuxksy/Meridian-X/actions/workflows/security-scan.yml/badge.svg)](https://github.com/deuxksy/Meridian-X/actions/workflows/security-scan.yml)\n\n*품격 있는 디지털 수집가를 위한 우아한 솔루션*\n\n**Meridian-X**는 귀하의 소중한 프라이빗 미디어 컬렉션을 완벽한 상태로 유지하기 위해 설계된 맞춤형 자동화 스위트입니다. 귀하의 디지털 서고가 항상 정돈되고, 깨끗하며, 즉시 감상 가능한 상태를 유지하도록 돕습니다.\n\n---\n\n## 🧐 철학 (Philosophy)\n신사의 서재는 언제나 정갈해야 합니다. **Meridian-X**는 보이지 않는 곳에서 다음과 같이 봉사합니다:\n- **수집 (Collect):** Whisparr가 수집할 수 없는 특별한 작품들을 신사의 취향에 맞추어 우아하게 수집합니다.\n- **정화 (Sanitize):** 파일명에 붙은 보기 흉한 광고 문구, 홍보용 태그, 그리고 가치 없는 부산물들을 정중하게 제거합니다.\n- **큐레이션 (Curate):** 동양과 서양, 그리고 특별한 취향(Niche)에 맞춰 콘텐츠를 자동으로 분류하고 적절한 위치로 안내합니다.\n\n---\n## 🔄 워크플로우 (Workflow)\n\n```mermaid\nflowchart TB\n    subgraph Collect[\"📥 Collect (수집)\"]\n        RSS[RSS 피드] --\u003e TORR[토렌트 파일]\n        TORR --\u003e WATCH[Watch 폴더]\n        WATCH --\u003e DL[다운로드 완료]\n    end\n\n    subgraph Classify[\"🏷️ Classify (분류)\"]\n        SRC[SOURCE_PATH] --\u003e P1[1️⃣ Purify\u003cbr/\u003e불순물 제거]\n        P1 --\u003e P2[2️⃣ Refine\u003cbr/\u003e파일명 정제]\n        P2 --\u003e P3[3️⃣ Organize\u003cbr/\u003e구조 정돈]\n        P3 --\u003e WORK[WORK_PATH]\n        WORK --\u003e C1[4️⃣ Cleanse\u003cbr/\u003e빈 폴더 정리]\n        C1 --\u003e C2[5️⃣ Classify\u003cbr/\u003e분류]\n    end\n\n    subgraph Priority[\"📊 분류 우선순위\"]\n        C2 --\u003e A1[1계급: Artist\u003cbr/\u003e출연자]\n        C2 --\u003e A2[2계급: Genre\u003cbr/\u003e장르]\n        C2 --\u003e A3[3계급: Studio\u003cbr/\u003e스튜디오]\n        C2 --\u003e A4[4계급: Orient\u003cbr/\u003e동양]\n        C2 --\u003e A5[5계급: Occident\u003cbr/\u003e서양]\n    end\n\n    DL --\u003e SRC\n    A1 --\u003e TARGET[📁 Target Folders]\n    A2 --\u003e TARGET\n    A3 --\u003e TARGET\n    A4 --\u003e TARGET\n    A5 --\u003e TARGET\n\n    style Collect fill:#e1f5fe\n    style Classify fill:#f3e5f5\n    style Priority fill:#fff3e0\n```\n\n---\n\n## 📁 프로젝트 구조\n\n```\nMeridian-X/\n├── .gitignore\n├── README.md\n├── pyproject.toml\n├── uv.lock\n├── config/\n│   ├── settings.json          # 전체 설정 (git 제외)\n│   └── settings.json.example  # 설정 템플릿\n└── src/meridian_x/\n    ├── __init__.py\n    ├── cli.py                 # CLI 진입점\n    ├── classify.py            # 분류 로직\n    └── collect.py             # 수집 로직\n```\n\n---\n\n## ⚙️ 설정 (Configuration)\n\n### settings.json 구조\n\n```json\n{\n  \"feed\": {\n    \"base_url\": \"https://example.com\",\n    \"rss_url\": \"https://example.com/feeds/\"\n  },\n  \"download\": {\n    \"watch_path\": \"/path/to/torrent/watch\",\n    \"history_file\": \"logs/downloads.txt\",\n    \"request_timeout\": 30,\n    \"user_agent\": \"Mozilla/5.0 ...\"\n  },\n  \"classify\": {\n    \"source_path\": \"/path/to/source\",\n    \"work_path\": \"/path/to/work\",\n    \"target_dirs\": [\"target1\", \"target2\"],\n    \"artist_folders\": [\"ArtistA\", \"ArtistB\"],\n    \"studio_folders\": [\"StudioX\", \"StudioY\"],\n    \"delete_keywords\": [\"sample\", \"trailer\", \"preview\"],\n    \"delete_extensions\": [\".txt\", \".url\", \".nfo\"],\n    \"video_extensions\": [\".mp4\", \".mkv\", \".avi\"]\n  },\n  \"genres\": {\n    \"GenreName\": {\n      \"keywords\": [\"keyword1\"],\n      \"prefixes\": [\"PRE-\"]\n    }\n  }\n}\n```\n\n\u003e **참고:** `config/settings.json`은 git에서 제외됩니다. `settings.json.example`을 복사하여 수정하세요.\n\n---\n\n## 🎩 주요 기능 (Features)\n\n### Collect (수집)\nMulti-source RSS 수집 → Transmission RPC 전송.\n- **Multi-source:** onejav(RSS → 페이지 방문 → `.torrent`), xxxclub(RSS → magnet 직접 전송)\n- **Selective download:** 광고 파일 자동 제외 (확장자/키워드/최소 크기 필터)\n- **자동 라벨링:** torrent name에서 메이커 코드/스튜디오/배우 추출\n- **Source 선택:** `--source`로 특정 source만 실행\n- **히스토리 관리:** `{source}:{id}` 형태로 중복 수집 방지\n\n### Tidy (원격 정리)\nSSH 기반 원격 파일 정리 (heritage 서버). tidy → classify 워크플로우의 첫 단계.\n- **정크 삭제:** Jellyfin API로 키워드/확장자 기반 정크 파일 삭제\n- **Flatten:** 비디오 1개 폴더를 상위로 평준화\n- **파일명 정리:** 광고 접두사 제거 (`hhd800.com@` 등)\n- **라이브러리 갱신:** Jellyfin library refresh\n\n### Classify (원격 분류)\ntidy(flatten) 이후, flatten된 파일을 우선순위별로 분류. SSH 하이브리드 방식 (Python 매칭 로직 + SSH `mv`).\n\n**분류 우선순위:**\n1. **배우 (Artist)** — `artist_folders` (파일명 포함 매칭)\n2. **스튜디오 (Studio)** — `studio_folders` (예: vixen, tiny4k, wowgirls, vivthomas)\n3. **장르 (Genre)** — `genres` 키워드/접두사 규칙\n4. **JPN** — JAV 패턴 `^[A-Z]{3,5}-\\d{3,5}` (예: SONE-446, ABC-001)\n5. **FC2** — `FC2-PPV-*` 패턴\n6. **West** — 매칭되지 않은 나머지 영상 파일 (fallback)\n\n\u003e tidy(정리) → classify(분류) 순서로 실행. 중복 파일은 원본 삭제.\n\n---\n\n## 🥂 사용법 (Usage)\n\n큐레이션을 시작하시려면, 그저 집사를 호출하십시오:\n\n```bash\n# ========== Setup (초기 설정) ==========\nuv sync                                    # 의존성 설치\ncp config/settings.json.example config/settings.json\n# settings.json 편집...\n\n# ========== Collect (수집) ==========\nuv run meridian transmission --dry-run            # 항상 먼저 미리보기 (권장)\nuv run meridian transmission                      # 전체 source 수집 (최대 30개)\nuv run meridian transmission --source onejav      # onejav만\nuv run meridian transmission --source xxxclub     # xxxclub만\nuv run meridian transmission --max-downloads 50   # 최대 50개 (전체 source 합산)\n\n# ========== Filter (기존 토렌트 필터링) ==========\nuv run meridian filter                  # 기존 토렌트 광고 파일 일괄 제외\n\n# ========== Label (기존 토렌트 라벨링) ==========\nuv run meridian label                   # 메이커 코드/스튜디오/배우 labels 자동 설정\n\n# ========== Sync (Transmission → Jellyfin) ==========\nuv run meridian sync                    # Transmission labels → Jellyfin Tags 동기화\n\n# ========== Tidy (원격 정리) ==========\nuv run meridian tidy                    # 정크삭제→Flatten→파일명정리→갱신\n\n# ========== Classify (원격 분류, tidy 후 실행) ==========\nuv run meridian classify --dry-run      # 미리보기 (권장)\nuv run meridian classify                # SSH로 원격 파일 분류\n```\n\n---\n\n## 📋 명령어 옵션\n\n### transmission\n| 옵션 | 설명 | 기본값 |\n| :--- | :--- | :--- |\n| `--dry-run` | 실제 전송 없이 수집 항목만 출력 | - |\n| `--source NAME` | 수집 source 지정 (onejav, xxxclub) | 전체 |\n| `--max-downloads N` | 최대 다운로드 수 (전체 source 합산) | 30 |\n\n### filter / label\n| 옵션 | 설명 | 비고 |\n| :--- | :--- | :--- |\n| `--dry-run` | 실제 변경 없이 요약만 출력 | 영향받는 항목은 나열하지 않음 |\n\n### tidy / classify\n| 옵션 | 설명 | 기본값 |\n| :--- | :--- | :--- |\n| `--dry-run` | 실제 이동/변경 없이 결과만 출력 | - |\n\n### sync\n옵션 없음. 실행 즉시 Transmission labels → Jellyfin Tags 동기화 (`--dry-run` 미지원).\n\n---\n\n*Meridian-X는 조용히 관찰하고, 정리하며, 오직 필요할 때만 보고할 것입니다.*\n\n---\n*\"질서는 정신의 건전함이자, 신체의 건강이며, 도시의 평화이다.\"*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeuxksy%2Fmeridian-x","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeuxksy%2Fmeridian-x","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeuxksy%2Fmeridian-x/lists"}