https://github.com/deuxksy/meridian-x
소중한 미디어 컬렉션을 완벽하게 관리하는 품격 있는 자동화 큐레이션 솔루션.
https://github.com/deuxksy/meridian-x
automation curation dlna media-organizer meridian-x python
Last synced: 7 days ago
JSON representation
소중한 미디어 컬렉션을 완벽하게 관리하는 품격 있는 자동화 큐레이션 솔루션.
- Host: GitHub
- URL: https://github.com/deuxksy/meridian-x
- Owner: deuxksy
- Created: 2026-01-11T16:12:11.000Z (6 months ago)
- Default Branch: main
- Last Pushed: 2026-06-27T04:08:06.000Z (7 days ago)
- Last Synced: 2026-06-27T04:08:42.335Z (7 days ago)
- Topics: automation, curation, dlna, media-organizer, meridian-x, python
- Language: Python
- Size: 223 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Roadmap: ROADMAP.md
Awesome Lists containing this project
README
# Meridian-X
[](https://github.com/deuxksy/Meridian-X/actions/workflows/security-scan.yml)
*품격 있는 디지털 수집가를 위한 우아한 솔루션*
**Meridian-X**는 귀하의 소중한 프라이빗 미디어 컬렉션을 완벽한 상태로 유지하기 위해 설계된 맞춤형 자동화 스위트입니다. 귀하의 디지털 서고가 항상 정돈되고, 깨끗하며, 즉시 감상 가능한 상태를 유지하도록 돕습니다.
---
## 🧐 철학 (Philosophy)
신사의 서재는 언제나 정갈해야 합니다. **Meridian-X**는 보이지 않는 곳에서 다음과 같이 봉사합니다:
- **수집 (Collect):** Whisparr가 수집할 수 없는 특별한 작품들을 신사의 취향에 맞추어 우아하게 수집합니다.
- **정화 (Sanitize):** 파일명에 붙은 보기 흉한 광고 문구, 홍보용 태그, 그리고 가치 없는 부산물들을 정중하게 제거합니다.
- **큐레이션 (Curate):** 동양과 서양, 그리고 특별한 취향(Niche)에 맞춰 콘텐츠를 자동으로 분류하고 적절한 위치로 안내합니다.
---
## 🔄 워크플로우 (Workflow)
```mermaid
flowchart TB
subgraph Collect["📥 Collect (수집)"]
RSS[RSS 피드] --> TORR[토렌트 파일]
TORR --> WATCH[Watch 폴더]
WATCH --> DL[다운로드 완료]
end
subgraph Classify["🏷️ Classify (분류)"]
SRC[SOURCE_PATH] --> P1[1️⃣ Purify
불순물 제거]
P1 --> P2[2️⃣ Refine
파일명 정제]
P2 --> P3[3️⃣ Organize
구조 정돈]
P3 --> WORK[WORK_PATH]
WORK --> C1[4️⃣ Cleanse
빈 폴더 정리]
C1 --> C2[5️⃣ Classify
분류]
end
subgraph Priority["📊 분류 우선순위"]
C2 --> A1[1계급: Artist
출연자]
C2 --> A2[2계급: Genre
장르]
C2 --> A3[3계급: Studio
스튜디오]
C2 --> A4[4계급: Orient
동양]
C2 --> A5[5계급: Occident
서양]
end
DL --> SRC
A1 --> TARGET[📁 Target Folders]
A2 --> TARGET
A3 --> TARGET
A4 --> TARGET
A5 --> TARGET
style Collect fill:#e1f5fe
style Classify fill:#f3e5f5
style Priority fill:#fff3e0
```
---
## 📁 프로젝트 구조
```
Meridian-X/
├── .gitignore
├── README.md
├── pyproject.toml
├── uv.lock
├── config/
│ ├── settings.json # 전체 설정 (git 제외)
│ └── settings.json.example # 설정 템플릿
└── src/meridian_x/
├── __init__.py
├── cli.py # CLI 진입점
├── classify.py # 분류 로직
└── collect.py # 수집 로직
```
---
## ⚙️ 설정 (Configuration)
### settings.json 구조
```json
{
"feed": {
"base_url": "https://example.com",
"rss_url": "https://example.com/feeds/"
},
"download": {
"watch_path": "/path/to/torrent/watch",
"history_file": "logs/downloads.txt",
"request_timeout": 30,
"user_agent": "Mozilla/5.0 ..."
},
"classify": {
"source_path": "/path/to/source",
"work_path": "/path/to/work",
"target_dirs": ["target1", "target2"],
"artist_folders": ["ArtistA", "ArtistB"],
"studio_folders": ["StudioX", "StudioY"],
"delete_keywords": ["sample", "trailer", "preview"],
"delete_extensions": [".txt", ".url", ".nfo"],
"video_extensions": [".mp4", ".mkv", ".avi"]
},
"genres": {
"GenreName": {
"keywords": ["keyword1"],
"prefixes": ["PRE-"]
}
}
}
```
> **참고:** `config/settings.json`은 git에서 제외됩니다. `settings.json.example`을 복사하여 수정하세요.
---
## 🎩 주요 기능 (Features)
### Collect (수집)
Multi-source RSS 수집 → Transmission RPC 전송.
- **Multi-source:** onejav(RSS → 페이지 방문 → `.torrent`), xxxclub(RSS → magnet 직접 전송)
- **Selective download:** 광고 파일 자동 제외 (확장자/키워드/최소 크기 필터)
- **자동 라벨링:** torrent name에서 메이커 코드/스튜디오/배우 추출
- **Source 선택:** `--source`로 특정 source만 실행
- **히스토리 관리:** `{source}:{id}` 형태로 중복 수집 방지
### Tidy (원격 정리)
SSH 기반 원격 파일 정리 (heritage 서버). tidy → classify 워크플로우의 첫 단계.
- **정크 삭제:** Jellyfin API로 키워드/확장자 기반 정크 파일 삭제
- **Flatten:** 비디오 1개 폴더를 상위로 평준화
- **파일명 정리:** 광고 접두사 제거 (`hhd800.com@` 등)
- **라이브러리 갱신:** Jellyfin library refresh
### Classify (원격 분류)
tidy(flatten) 이후, flatten된 파일을 우선순위별로 분류. SSH 하이브리드 방식 (Python 매칭 로직 + SSH `mv`).
**분류 우선순위:**
1. **배우 (Artist)** — `artist_folders` (파일명 포함 매칭)
2. **스튜디오 (Studio)** — `studio_folders` (예: vixen, tiny4k, wowgirls, vivthomas)
3. **장르 (Genre)** — `genres` 키워드/접두사 규칙
4. **JPN** — JAV 패턴 `^[A-Z]{3,5}-\d{3,5}` (예: SONE-446, ABC-001)
5. **FC2** — `FC2-PPV-*` 패턴
6. **West** — 매칭되지 않은 나머지 영상 파일 (fallback)
> tidy(정리) → classify(분류) 순서로 실행. 중복 파일은 원본 삭제.
---
## 🥂 사용법 (Usage)
큐레이션을 시작하시려면, 그저 집사를 호출하십시오:
```bash
# ========== Setup (초기 설정) ==========
uv sync # 의존성 설치
cp config/settings.json.example config/settings.json
# settings.json 편집...
# ========== Collect (수집) ==========
uv run meridian transmission --dry-run # 항상 먼저 미리보기 (권장)
uv run meridian transmission # 전체 source 수집 (최대 30개)
uv run meridian transmission --source onejav # onejav만
uv run meridian transmission --source xxxclub # xxxclub만
uv run meridian transmission --max-downloads 50 # 최대 50개 (전체 source 합산)
# ========== Filter (기존 토렌트 필터링) ==========
uv run meridian filter # 기존 토렌트 광고 파일 일괄 제외
# ========== Label (기존 토렌트 라벨링) ==========
uv run meridian label # 메이커 코드/스튜디오/배우 labels 자동 설정
# ========== Sync (Transmission → Jellyfin) ==========
uv run meridian sync # Transmission labels → Jellyfin Tags 동기화
# ========== Tidy (원격 정리) ==========
uv run meridian tidy # 정크삭제→Flatten→파일명정리→갱신
# ========== Classify (원격 분류, tidy 후 실행) ==========
uv run meridian classify --dry-run # 미리보기 (권장)
uv run meridian classify # SSH로 원격 파일 분류
```
---
## 📋 명령어 옵션
### transmission
| 옵션 | 설명 | 기본값 |
| :--- | :--- | :--- |
| `--dry-run` | 실제 전송 없이 수집 항목만 출력 | - |
| `--source NAME` | 수집 source 지정 (onejav, xxxclub) | 전체 |
| `--max-downloads N` | 최대 다운로드 수 (전체 source 합산) | 30 |
### filter / label
| 옵션 | 설명 | 비고 |
| :--- | :--- | :--- |
| `--dry-run` | 실제 변경 없이 요약만 출력 | 영향받는 항목은 나열하지 않음 |
### tidy / classify
| 옵션 | 설명 | 기본값 |
| :--- | :--- | :--- |
| `--dry-run` | 실제 이동/변경 없이 결과만 출력 | - |
### sync
옵션 없음. 실행 즉시 Transmission labels → Jellyfin Tags 동기화 (`--dry-run` 미지원).
---
*Meridian-X는 조용히 관찰하고, 정리하며, 오직 필요할 때만 보고할 것입니다.*
---
*"질서는 정신의 건전함이자, 신체의 건강이며, 도시의 평화이다."*