jav-manager 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ja.md ADDED
@@ -0,0 +1,188 @@
1
+ # JavManager
2
+
3
+ 軽量なGUI + CLIツールで、JAVコンテンツの自動管理、高速なリピート検索、トレント検索、およびオプションでqBittorrentとの統合を提供します。
4
+
5
+ [中文](README.zh-CN.md) | [日本語](README.ja.md) | [한국어](README.ko.md)
6
+
7
+ > **注意:** Everything(ローカル検索)とqBittorrent(ダウンロード)はオプションの統合機能です。これらがなくてもJavManagerは動作します(JavDBの検索とマグネットリンクの出力は可能です)。他のHTTP APIをサポートするツール(他の検索エンジンやダウンロードクライアントなど)が必要な場合は、[Issueを作成してください](../../issues/new)。
8
+
9
+ ## 機能
10
+
11
+ - GUI(Avalonia)とコンソールモード(Spectre.Console)
12
+ - 多言語GUI(英語、中国語、日本語、韓国語)
13
+ - JavDBからのJAVメタデータとトレント/マグネットの検索
14
+ - Everything検索エンジンによるローカルファイルの確認
15
+ - qBittorrent WebUI API経由でのダウンロード
16
+ - リピート検索用のローカルJSONキャッシュ
17
+ - 重みベースのランキングによるスマートなトレント選択(マーカー+重み)
18
+
19
+ ## ワークフロー
20
+
21
+ ```mermaid
22
+ flowchart TD
23
+ A[Input JAV ID] --> B{Data available?}
24
+ B -->|Yes| C[Use existing metadata]
25
+ B -->|No| D[Fetch from JavDB]
26
+ C --> E[Rank torrents]
27
+ D --> E
28
+ E --> F{Local file exists?}
29
+ F -->|Yes| G[Show options]
30
+ F -->|No| H[Add to downloader]
31
+ G --> H
32
+ H --> I[Done]
33
+
34
+ classDef primary fill:#2563eb,stroke:#1d4ed8,color:#ffffff;
35
+ classDef decision fill:#f59e0b,stroke:#d97706,color:#111827;
36
+ classDef neutral fill:#ffffff,stroke:#e5e7eb,color:#1f2937;
37
+
38
+ class A,H,I primary;
39
+ class B,F decision;
40
+ class C,D,E,G neutral;
41
+ ```
42
+
43
+ ## 外部依存関係
44
+
45
+ | サービス | 必須 | 目的 | リンク |
46
+ |---------|----------|---------|------|
47
+ | JavDB | はい | メタデータとマグネットリンク | [javdb.com](https://javdb.com/) |
48
+ | Everything | いいえ(オプション) | ローカルファイル検索 | [voidtools.com](https://www.voidtools.com/everything-1.5a/) ([HTTPプラグイン](https://www.voidtools.com/forum/viewtopic.php?f=12&t=9799)) |
49
+ | qBittorrent | いいえ(オプション) | トレントダウンロード | [qBittorrent](https://github.com/qbittorrent/qBittorrent) |
50
+
51
+ ### Cloudflare 403問題
52
+
53
+ JavDBがHTTP 403を返す場合、それはおそらくCloudflareのチャレンジによるものです。JavManagerはデフォルトで**curl-impersonateを使用して**、実際のブラウザのTLS/HTTP2フィンガープリントを模倣します(ブラウザ自動化は使用しません)。それでも403が表示される場合は、別のミラーURLを試すか、IPがブロックされていないか確認してください(`doc/CloudflareBypass.md`を参照)。
54
+
55
+ ### JavDBドメインAPI
56
+
57
+ Cloudflare Workerは、公式サイトから最新のJavDBドメインを取得するAPIエンドポイントを提供します:
58
+
59
+ **エンドポイント:** `GET /api/javdb-domain`
60
+
61
+ **リクエスト例:**
62
+ ```bash
63
+ curl https://your-worker-url/api/javdb-domain
64
+ ```
65
+
66
+ **レスポンス例:**
67
+ ```json
68
+ {
69
+ "success": true,
70
+ "domains": ["javdb565.com"]
71
+ }
72
+ ```
73
+
74
+ **エラーレスポンス:**
75
+ ```json
76
+ {
77
+ "success": false,
78
+ "error": "Failed to fetch domain from javdb.com",
79
+ "message": "Could not extract latest domain from javdb.com"
80
+ }
81
+ ```
82
+
83
+ このAPIは`https://javdb.com/`からリアルタイムで最新のJavDBドメインを取得します。APIには10秒のタイムアウトと適切なエラー処理が含まれています。
84
+
85
+ ### テレメトリ + "Jav Trends"(オプション)
86
+
87
+ `Telemetry:Enabled`がtrueの場合、JavManagerは以下を投稿できます:
88
+
89
+ - `POST /api/telemetry`への起動イベント
90
+ - `POST /api/javinfo`へのJAVメタデータ(ワーカーUIで使用;重複したレポートはIDごとの検索カウンターをインクリメント)
91
+
92
+ ワーカーは小さなUIも提供します:
93
+
94
+ - `/` 概要
95
+ - `/jav` "Jav Trends"(最近のJavInfoレコード+検索カウント)
96
+
97
+ ## 設定
98
+
99
+ 設定は`appsettings.json`(およびオプションで`appsettings.Development.json`)を介して行われます。
100
+
101
+ - 開発: `JavManager/appsettings.json`を編集(`bin/Debug/net10.0/appsettings.json`にコピーされます)。
102
+ - リリース/単一ファイル: アプリは初回実行時に実行ファイルの隣に(存在しない場合は作成して)`appsettings.json`を読み込みます。
103
+
104
+ 設定リファレンス:
105
+
106
+ | セクション | キー | 必須 | デフォルト | 説明 |
107
+ |---------|-----|----------|---------|-------------|
108
+ | Everything | `BaseUrl` | いいえ(オプション) | _(空)_ | Everything HTTPサーバーのベースURL(スキームとホストを含む)。利用できない場合、ローカル重複排除はスキップされます。 |
109
+ | Everything | `UserName` | いいえ(オプション) | _(空)_ | Basic認証のユーザー名。 |
110
+ | Everything | `Password` | いいえ(オプション) | _(空)_ | Basic認証のパスワード。 |
111
+ | QBittorrent | `BaseUrl` | いいえ(オプション) | _(空)_ | qBittorrent WebUIのベースURL(必要に応じてポートを含む)。利用できない/認証に失敗した場合、JavManagerはマグネットリンクを印刷するだけでダウンロードキューには追加しません。 |
112
+ | QBittorrent | `UserName` | いいえ(オプション) | _(空)_ | WebUIのユーザー名。 |
113
+ | QBittorrent | `Password` | いいえ(オプション) | _(空)_ | WebUIのパスワード。 |
114
+ | JavDb | `BaseUrl` | はい | `https://javdb.com` | プライマリJavDBベースURL。 |
115
+ | JavDb | `MirrorUrls` | いいえ(オプション) | `[]` | 追加のミラーURL(配列)。 |
116
+ | JavDb | `RequestTimeout` | いいえ(オプション) | `30000` | リクエストタイムアウト(ミリ秒)。 |
117
+ | JavDb | `UserAgent` | いいえ(オプション) | _(空)_ | カスタムUser-Agent文字列(HttpClientフォールバックモードでのみ使用)。 |
118
+ | JavDb | `CurlImpersonate:Enabled` | いいえ(オプション) | `true` | JavDBリクエストでcurl-impersonateを有効にする(推奨)。 |
119
+ | JavDb | `CurlImpersonate:Target` | いいえ(オプション) | `chrome116` | `curl_easy_impersonate()`の偽装ターゲット名(例: `chrome116`)。 |
120
+ | JavDb | `CurlImpersonate:LibraryPath` | いいえ(オプション) | _(空)_ | `libcurl.dll`へのオプションの明示的なパス(そうでない場合は自動検出)。 |
121
+ | JavDb | `CurlImpersonate:CaBundlePath` | いいえ(オプション) | _(空)_ | `cacert.pem`へのオプションのパス(そうでない場合は自動検出)。 |
122
+ | JavDb | `CurlImpersonate:DefaultHeaders` | いいえ(オプション) | `true` | curl-impersonateの組み込みデフォルトHTTPヘッダーを使用する。 |
123
+ | Download | `DefaultSavePath` | いいえ(オプション) | _(空)_ | qBittorrentにトレントを追加するときのデフォルト保存パス。 |
124
+ | Download | `DefaultCategory` | いいえ(オプション) | `jav` | qBittorrentのデフォルトカテゴリ。 |
125
+ | Download | `DefaultTags` | いいえ(オプション) | `jav-manager` | 作成されたダウンロードのデフォルトタグ。 |
126
+ | LocalCache | `Enabled` | いいえ(オプション) | `true` | ローカルキャッシュストレージを有効または無効にする。 |
127
+ | LocalCache | `DatabasePath` | いいえ(オプション) | _(空)_ | JSONキャッシュファイルパス(空のままにすると実行ファイルの隣のデフォルトの`jav_cache.json`が使用される)。 |
128
+ | LocalCache | `CacheExpirationDays` | いいえ(オプション) | `0` | キャッシュのTTL(日数)(0は期限切れを無効にする)。 |
129
+ | Console | `Language` | いいえ(オプション) | `en` | UI言語(`en`、`zh`、または`auto`)。 |
130
+ | Console | `HideOtherTorrents` | いいえ(オプション) | `true` | リスト内の非一致トレントを非表示にする。 |
131
+ | Telemetry | `Enabled` | いいえ(オプション) | `true` | 匿名テレメトリを有効または無効にする。 |
132
+ | Telemetry | `Endpoint` | いいえ(オプション) | `https://jav-manager.techfetch.dev` | ベースエンドポイント(アプリは`/api/telemetry`と`/api/javinfo`に投稿する)。 |
133
+ | Update | `Enabled` | いいえ(オプション) | `true` | アップデートチェックを有効または無効にする。 |
134
+ | Update | `AutoCheckOnStartup` | いいえ(オプション) | `true` | 起動時に自動でアップデートをチェックする(GUI)。 |
135
+ | Update | `GitHubRepo` | いいえ(オプション) | `jqknono/jav-manager` | アップデートチェックに使用するGitHubリポジトリ。 |
136
+
137
+ 注記:
138
+ - `JavInfoSync:*`は古いセクション名です。新しいビルドでは`Telemetry:*`を使用します(アプリは後方互換性のために古いキーも読み取ります)。
139
+ - 上級者向け:設定は`JAVMANAGER_`プレフィックスを使用した環境変数もサポートします(入れ子のキーは`__`を使用しますが)、ファイルベースの設定が主要なサポート方法です。
140
+
141
+ ## 使用方法
142
+
143
+ ```bash
144
+ # GUI(引数なしのデフォルト)
145
+ dotnet run --project JavManager/JavManager.csproj
146
+
147
+ # コンソール(対話型)
148
+ dotnet run --project JavManager/JavManager.csproj -- --no-gui
149
+
150
+ # コンソール(非対話型)
151
+ dotnet run --project JavManager/JavManager.csproj -- STARS-001
152
+
153
+ # ヘルプを表示
154
+ dotnet run --project JavManager/JavManager.csproj -- help
155
+
156
+ # バージョンを表示
157
+ dotnet run --project JavManager/JavManager.csproj -- version
158
+ ```
159
+
160
+ コンソールコマンドについては、`dotnet run --project JavManager/JavManager.csproj -- help`を実行してください。
161
+
162
+ ## ビルドとパッケージ化
163
+
164
+ ```bash
165
+ # ビルド
166
+ dotnet build JavManager/JavManager.csproj
167
+
168
+ # テストを実行
169
+ dotnet test JavManager.Tests/JavManager.Tests.csproj
170
+
171
+ # 公開(マルチRID、自己完結型、出力先はartifacts/publish/<rid>/)
172
+ pwsh scripts/publish.ps1
173
+
174
+ # PATHにインストール(Windows)
175
+ pwsh scripts/install-windows.ps1 -AddToPath
176
+ ```
177
+
178
+ ### Android(実験的)
179
+
180
+ Androidビルドはオプトインです(デスクトップビルドがAndroidワークロードを必要としないように)。
181
+
182
+ ```bash
183
+ # ワークロードをインストール(1回のみ)
184
+ dotnet workload install android
185
+
186
+ # Androidターゲットをビルド(Android SDK/JDKが設定されている必要があります)
187
+ dotnet build JavManager/JavManager.csproj -c Debug -f net10.0-android -p:EnableAndroid=true
188
+ ```
package/README.ko.md ADDED
@@ -0,0 +1,188 @@
1
+ # JavManager
2
+
3
+ 경량 GUI + CLI 도구로 자동화된 JAV 콘텐츠 관리, 빠른 반복 검색, 토렌트 검색, 선택적 qBittorrent 통합 기능을 제공합니다.
4
+
5
+ [中文](README.zh-CN.md) | [日本語](README.ja.md) | [한국어](README.ko.md)
6
+
7
+ > **참고:** Everything(로컬 검색)과 qBittorrent(다운로드)는 선택적 통합 기능입니다. JavManager는 이들 없이도 작동합니다(여전히 JavDB를 검색하고 마그넷 링크를 출력할 수 있습니다). HTTP API를 지원하는 다른 도구(예: 다른 검색 엔진이나 다운로드 클라이언트)가 필요하면 [이슈 생성](../../issues/new)을 해주세요.
8
+
9
+ ## 기능
10
+
11
+ - GUI(Avalonia)와 콘솔 모드(Spectre.Console)
12
+ - 다국어 GUI(영어, 중국어, 일본어, 한국어)
13
+ - JavDB에서 JAV 메타데이터와 토렌트/마그넷 검색
14
+ - Everything 검색 엔진을 통한 로컬 파일 확인
15
+ - qBittorrent WebUI API를 통한 다운로드
16
+ - 반복 검색을 위한 로컬 JSON 캐시
17
+ - 가중치 기반 순위 매기기(마커 + 가중치)를 통한 스마트 토렌트 선택
18
+
19
+ ## 워크플로우
20
+
21
+ ```mermaid
22
+ flowchart TD
23
+ A[입력 JAV ID] --> B{데이터 사용 가능?}
24
+ B -->|예| C[기존 메타데이터 사용]
25
+ B -->|아니오| D[JavDB에서 가져오기]
26
+ C --> E[토렌트 순위 매기기]
27
+ D --> E
28
+ E --> F{로컬 파일 존재?}
29
+ F -->|예| G[옵션 표시]
30
+ F -->|아니오| H[다운로더에 추가]
31
+ G --> H
32
+ H --> I[완료]
33
+
34
+ classDef primary fill:#2563eb,stroke:#1d4ed8,color:#ffffff;
35
+ classDef decision fill:#f59e0b,stroke:#d97706,color:#111827;
36
+ classDef neutral fill:#ffffff,stroke:#e5e7eb,color:#1f2937;
37
+
38
+ class A,H,I primary;
39
+ class B,F decision;
40
+ class C,D,E,G neutral;
41
+ ```
42
+
43
+ ## 외부 종속성
44
+
45
+ | 서비스 | 필수 | 용도 | 링크 |
46
+ |---------|----------|---------|------|
47
+ | JavDB | 예 | 메타데이터 & 마그넷 링크 | [javdb.com](https://javdb.com/) |
48
+ | Everything | 아니오 (선택적) | 로컬 파일 검색 | [voidtools.com](https://www.voidtools.com/everything-1.5a/) ([HTTP 플러그인](https://www.voidtools.com/forum/viewtopic.php?f=12&t=9799)) |
49
+ | qBittorrent | 아니오 (선택적) | 토렌트 다운로드 | [qBittorrent](https://github.com/qbittorrent/qBittorrent) |
50
+
51
+ ### Cloudflare 403 문제
52
+
53
+ JavDB가 HTTP 403을 반환하면 Cloudflare 챌린지 때문일 가능성이 높습니다. JavManager는 **기본적으로 curl-impersonate를 사용하여 실제 브라우저 TLS/HTTP2 지문을 모방합니다(브라우저 자동화 없음)**. 그래도 403이 표시되면 다른 미러 URL을 시도하거나 IP가 차단되었는지 확인하세요(`doc/CloudflareBypass.md` 참조).
54
+
55
+ ### JavDB 도메인 API
56
+
57
+ Cloudflare Worker는 공식 사이트에서 최신 JavDB 도메인을 가져오는 API 엔드포인트를 제공합니다:
58
+
59
+ **엔드포인트:** `GET /api/javdb-domain`
60
+
61
+ **요청 예시:**
62
+ ```bash
63
+ curl https://your-worker-url/api/javdb-domain
64
+ ```
65
+
66
+ **응답 예시:**
67
+ ```json
68
+ {
69
+ "success": true,
70
+ "domains": ["javdb565.com"]
71
+ }
72
+ ```
73
+
74
+ **오류 응답:**
75
+ ```json
76
+ {
77
+ "success": false,
78
+ "error": "Failed to fetch domain from javdb.com",
79
+ "message": "Could not extract latest domain from javdb.com"
80
+ }
81
+ ```
82
+
83
+ 이 API는 `https://javdb.com/`에서 실시간으로 최신 JavDB 도메인을 가져옵니다. API에는 10초 타임아웃과 적절한 오류 처리가 포함되어 있습니다.
84
+
85
+ ### 원격 분석 + "Jav 트렌드" (선택적)
86
+
87
+ `Telemetry:Enabled`가 true이면 JavManager는 다음을 게시할 수 있습니다:
88
+
89
+ - `POST /api/telemetry`에 시작 이벤트
90
+ - `POST /api/javinfo`에 JAV 메타데이터(워커 UI에서 사용; 반복 보고는 각 ID 검색 카운터를 증가시킴)
91
+
92
+ 워커는 또한 작은 UI를 제공합니다:
93
+
94
+ - `/` 개요
95
+ - `/jav` "Jav 트렌드"(최근 JavInfo 레코드 + 검색 횟수)
96
+
97
+ ## 설정
98
+
99
+ 설정은 `appsettings.json`(및 선택적 `appsettings.Development.json`)을 통해 구성됩니다.
100
+
101
+ - 개발: `JavManager/appsettings.json` 편집(이 파일은 `bin/Debug/net10.0/appsettings.json`으로 복사됨).
102
+ - 릴리스/단일 파일: 앱은 첫 실행 시 실행 파일 옆에 있는 `appsettings.json`을 읽고(없으면 생성합니다).
103
+
104
+ 설정 참조:
105
+
106
+ | 섹션 | 키 | 필수 | 기본값 | 설명 |
107
+ |---------|-----|----------|---------|-------------|
108
+ | Everything | `BaseUrl` | 아니오 (선택적) | _(비어 있음)_ | Everything HTTP 서버 기본 URL(스키마와 호스트 포함). 사용할 수 없으면 로컬 중복 제거가 건너뜁니다. |
109
+ | Everything | `UserName` | 아니오 (선택적) | _(비어 있음)_ | 기본 인증 사용자 이름. |
110
+ | Everything | `Password` | 아니오 (선택적) | _(비어 있음)_ | 기본 인증 비밀번호. |
111
+ | QBittorrent | `BaseUrl` | 아니오 (선택적) | _(비어 있음)_ | qBittorrent WebUI 기본 URL(필요한 경우 포트 포함). 사용할 수 없거나 인증에 실패하면 JavManager는 마그넷 링크를 출력하지만 다운로드 큐에 추가하지 않습니다. |
112
+ | QBittorrent | `UserName` | 아니오 (선택적) | _(비어 있음)_ | WebUI 사용자 이름. |
113
+ | QBittorrent | `Password` | 아니오 (선택적) | _(비어 있음)_ | WebUI 비밀번호. |
114
+ | JavDb | `BaseUrl` | 예 | `https://javdb.com` | 기본 JavDB 기본 URL. |
115
+ | JavDb | `MirrorUrls` | 아니오 (선택적) | `[]` | 추가 미러 URL(배열). |
116
+ | JavDb | `RequestTimeout` | 아니오 (선택적) | `30000` | 요청 타임아웃(밀리초). |
117
+ | JavDb | `UserAgent` | 아니오 (선택적) | _(비어 있음)_ | 사용자 지정 User-Agent 문자열(HttpClient 폴백 모드에서만 사용). |
118
+ | JavDb | `CurlImpersonate:Enabled` | 아니오 (선택적) | `true` | JavDB 요청에 curl-impersonate 사용(권장). |
119
+ | JavDb | `CurlImpersonate:Target` | 아니오 (선택적) | `chrome116` | `curl_easy_impersonate()`에 사용할 모방 대상 이름(예: `chrome116`). |
120
+ | JavDb | `CurlImpersonate:LibraryPath` | 아니오 (선택적) | _(비어 있음)_ | `libcurl.dll`에 대한 선택적 명시적 경로(그렇지 않으면 자동 감지). |
121
+ | JavDb | `CurlImpersonate:CaBundlePath` | 아니오 (선택적) | _(비어 있음)_ | `cacert.pem`에 대한 선택적 경로(그렇지 않으면 자동 감지). |
122
+ | JavDb | `CurlImpersonate:DefaultHeaders` | 아니오 (선택적) | `true` | curl-impersonate 내장 기본 HTTP 헤더 사용. |
123
+ | Download | `DefaultSavePath` | 아니오 (선택적) | _(비어 있음)_ | qBittorrent에 토렌트를 추가할 때 기본 다운로드 경로. |
124
+ | Download | `DefaultCategory` | 아니오 (선택적) | `jav` | qBittorrent의 기본 카테고리. |
125
+ | Download | `DefaultTags` | 아니오 (선택적) | `jav-manager` | 생성된 다운로드에 대한 기본 태그. |
126
+ | LocalCache | `Enabled` | 아니오 (선택적) | `true` | 로컬 캐시 저장소 활성화 또는 비활성화. |
127
+ | LocalCache | `DatabasePath` | 아니오 (선택적) | _(비어 있음)_ | JSON 캐시 파일 경로(비어 있으면 기본 `jav_cache.json`이 실행 파일 옆에 사용됨). |
128
+ | LocalCache | `CacheExpirationDays` | 아니오 (선택적) | `0` | 캐시 TTL(일, 0은 만료 비활성화). |
129
+ | Console | `Language` | 아니오 (선택적) | `en` | UI 언어(`en`, `zh`, 또는 `auto`). |
130
+ | Console | `HideOtherTorrents` | 아니오 (선택적) | `true` | 목록에서 일치하지 않는 토렌트 숨기기. |
131
+ | Telemetry | `Enabled` | 아니오 (선택적) | `true` | 익명 원격 분석 활성화 또는 비활성화. |
132
+ | Telemetry | `Endpoint` | 아니오 (선택적) | `https://jav-manager.techfetch.dev` | 기본 엔드포인트(앱은 `/api/telemetry`와 `/api/javinfo`에 게시함). |
133
+ | Update | `Enabled` | 아니오 (선택적) | `true` | 업데이트 확인 활성화 또는 비활성화. |
134
+ | Update | `AutoCheckOnStartup` | 아니오 (선택적) | `true` | 시작 시 자동 업데이트 확인(GUI). |
135
+ | Update | `GitHubRepo` | 아니오 (선택적) | `jqknono/jav-manager` | 업데이트 확인에 사용되는 GitHub 저장소. |
136
+
137
+ 참고:
138
+ - `JavInfoSync:*`는 레거시 섹션 이름입니다. 새 빌드는 `Telemetry:*`를 사용합니다(앱은 하위 호환성을 위해 여전히 레거시 키를 읽습니다).
139
+ - 고급: 설정은 또한 `JAVMANAGER_` 접두사가 있는 환경 변수를 지원합니다(중첩 키는 `__`를 사용), 하지만 파일 기반 설정이 기본적으로 지원되는 방법입니다.
140
+
141
+ ## 사용법
142
+
143
+ ```bash
144
+ # GUI(인수가 없으면 기본값)
145
+ dotnet run --project JavManager/JavManager.csproj
146
+
147
+ # 콘솔(대화형)
148
+ dotnet run --project JavManager/JavManager.csproj -- --no-gui
149
+
150
+ # 콘솔(비대화형)
151
+ dotnet run --project JavManager/JavManager.csproj -- STARS-001
152
+
153
+ # 도움말 표시
154
+ dotnet run --project JavManager/JavManager.csproj -- help
155
+
156
+ # 버전 표시
157
+ dotnet run --project JavManager/JavManager.csproj -- version
158
+ ```
159
+
160
+ 콘솔 명령의 경우 `dotnet run --project JavManager/JavManager.csproj -- help`를 실행하세요.
161
+
162
+ ## 빌드 & 패키징
163
+
164
+ ```bash
165
+ # 빌드
166
+ dotnet build JavManager/JavManager.csproj
167
+
168
+ # 테스트 실행
169
+ dotnet test JavManager.Tests/JavManager.Tests.csproj
170
+
171
+ # 게시(다중 RID, 자체 포함, 출력은 artifacts/publish/<rid>/)
172
+ pwsh scripts/publish.ps1
173
+
174
+ # PATH에 설치(Windows)
175
+ pwsh scripts/install-windows.ps1 -AddToPath
176
+ ```
177
+
178
+ ### Android(실험적)
179
+
180
+ Android 빌드는 선택적입니다(데스크톱 빌드가 Android 워크로드를 필요로 하지 않도록 함).
181
+
182
+ ```bash
183
+ # 워크로드 설치(한 번)
184
+ dotnet workload install android
185
+
186
+ # Android 대상 빌드(Android SDK/JDK 구성 필요)
187
+ dotnet build JavManager/JavManager.csproj -c Debug -f net10.0-android -p:EnableAndroid=true
188
+ ```
package/README.md ADDED
@@ -0,0 +1,173 @@
1
+ # JavManager
2
+
3
+ A lightweight GUI + CLI tool for automated JAV content management with fast repeat searches, torrent search, and optional qBittorrent integration.
4
+
5
+ [中文](README.zh-CN.md) | [日本語](README.ja.md) | [한국어](README.ko.md)
6
+
7
+ > **Note:** Everything (local search) and qBittorrent (download) are optional integrations. JavManager works without them (it can still search JavDB and output magnet links). If you need support for other tools with HTTP API (e.g., other search engines or download clients), please [create an issue](../../issues/new).
8
+
9
+ ## Features
10
+
11
+ - GUI (local web UI) and console mode (Node.js)
12
+ - Multilingual UI (English, Chinese)
13
+ - Search JAV metadata and torrents/magnets from JavDB
14
+ - Check local files via Everything search engine
15
+ - Download via qBittorrent WebUI API
16
+ - Local JSON cache for repeat searches
17
+ - Smart torrent selection with weight-based ranking (markers + weights)
18
+
19
+ ## Workflow
20
+
21
+ ```mermaid
22
+ flowchart TD
23
+ A[Input JAV ID] --> B{Data available?}
24
+ B -->|Yes| C[Use existing metadata]
25
+ B -->|No| D[Fetch from JavDB]
26
+ C --> E[Rank torrents]
27
+ D --> E
28
+ E --> F{Local file exists?}
29
+ F -->|Yes| G[Show options]
30
+ F -->|No| H[Add to downloader]
31
+ G --> H
32
+ H --> I[Done]
33
+
34
+ classDef primary fill:#2563eb,stroke:#1d4ed8,color:#ffffff;
35
+ classDef decision fill:#f59e0b,stroke:#d97706,color:#111827;
36
+ classDef neutral fill:#ffffff,stroke:#e5e7eb,color:#1f2937;
37
+
38
+ class A,H,I primary;
39
+ class B,F decision;
40
+ class C,D,E,G neutral;
41
+ ```
42
+
43
+ ## External Dependencies
44
+
45
+ | Service | Required | Purpose | Link |
46
+ |---------|----------|---------|------|
47
+ | JavDB | Yes | Metadata & magnet links | [javdb.com](https://javdb.com/) |
48
+ | Everything | No (optional) | Local file search | [voidtools.com](https://www.voidtools.com/everything-1.5a/) ([HTTP plugin](https://www.voidtools.com/forum/viewtopic.php?f=12&t=9799)) |
49
+ | qBittorrent | No (optional) | Torrent download | [qBittorrent](https://github.com/qbittorrent/qBittorrent) |
50
+
51
+ ### Cloudflare 403 Issue
52
+
53
+ If JavDB returns HTTP 403, it's likely due to a Cloudflare challenge. JavManager uses **curl-impersonate by default** to mimic a real browser TLS/HTTP2 fingerprint (no browser automation). If you still see 403, try a different mirror URL or check if your IP is blocked (see `doc/CloudflareBypass.md`).
54
+
55
+ ### JavDB Domain API
56
+
57
+ The Cloudflare Worker provides an API endpoint to get the latest JavDB domain from the official site:
58
+
59
+ **Endpoint:** `GET /api/javdb-domain`
60
+
61
+ **Example Request:**
62
+ ```bash
63
+ curl https://your-worker-url/api/javdb-domain
64
+ ```
65
+
66
+ **Example Response:**
67
+ ```json
68
+ {
69
+ "success": true,
70
+ "domains": ["javdb565.com"]
71
+ }
72
+ ```
73
+
74
+ **Error Response:**
75
+ ```json
76
+ {
77
+ "success": false,
78
+ "error": "Failed to fetch domain from javdb.com",
79
+ "message": "Could not extract latest domain from javdb.com"
80
+ }
81
+ ```
82
+
83
+ This API fetches the latest JavDB domain from `https://javdb.com/` in real-time. The API includes a 10-second timeout and proper error handling.
84
+
85
+ ### Telemetry + "Jav Trends" (Optional)
86
+
87
+ If `Telemetry:Enabled` is true, JavManager can post:
88
+
89
+ - A startup event to `POST /api/telemetry`
90
+ - JAV metadata to `POST /api/javinfo` (used by the worker UI; repeated reports increment the per-ID search counter)
91
+
92
+ The worker also serves a small UI:
93
+
94
+ - `/` overview
95
+ - `/jav` "Jav Trends" (recent JavInfo records + search counts)
96
+
97
+ ## Configuration
98
+
99
+ Settings are configured via `appsettings.json` (and optional `appsettings.Development.json`).
100
+
101
+ - Development: edit `JavManager/appsettings.json` (it is copied to `bin/Debug/net10.0/appsettings.json`).
102
+ - Release/single-file: the app will read (and if missing, create) an `appsettings.json` next to the executable on first run.
103
+
104
+ Configuration reference:
105
+
106
+ | Section | Key | Required | Default | Description |
107
+ |---------|-----|----------|---------|-------------|
108
+ | Everything | `BaseUrl` | No (optional) | _(empty)_ | Everything HTTP server base URL (include scheme and host). If unavailable, local dedup is skipped. |
109
+ | Everything | `UserName` | No (optional) | _(empty)_ | Basic auth user name. |
110
+ | Everything | `Password` | No (optional) | _(empty)_ | Basic auth password. |
111
+ | QBittorrent | `BaseUrl` | No (optional) | _(empty)_ | qBittorrent WebUI base URL (include port if needed). If unavailable/auth fails, JavManager prints magnet links without adding to download queue. |
112
+ | QBittorrent | `UserName` | No (optional) | _(empty)_ | WebUI user name. |
113
+ | QBittorrent | `Password` | No (optional) | _(empty)_ | WebUI password. |
114
+ | JavDb | `BaseUrl` | Yes | `https://javdb.com` | Primary JavDB base URL. |
115
+ | JavDb | `MirrorUrls` | No (optional) | `[]` | Additional mirror URLs (array). |
116
+ | JavDb | `RequestTimeout` | No (optional) | `30000` | Request timeout in milliseconds. |
117
+ | JavDb | `UserAgent` | No (optional) | _(empty)_ | Custom User-Agent string (used only in HttpClient fallback mode). |
118
+ | JavDb | `CurlImpersonate:Enabled` | No (optional) | `true` | Enable curl-impersonate for JavDB requests (recommended). |
119
+ | JavDb | `CurlImpersonate:Target` | No (optional) | `chrome116` | Impersonation target name for `curl_easy_impersonate()` (e.g. `chrome116`). |
120
+ | JavDb | `CurlImpersonate:LibraryPath` | No (optional) | _(empty)_ | Optional explicit path to `libcurl.dll` (otherwise auto-detected). |
121
+ | JavDb | `CurlImpersonate:CaBundlePath` | No (optional) | _(empty)_ | Optional path to `cacert.pem` (otherwise auto-detected). |
122
+ | JavDb | `CurlImpersonate:DefaultHeaders` | No (optional) | `true` | Use curl-impersonate built-in default HTTP headers. |
123
+ | Download | `DefaultSavePath` | No (optional) | _(empty)_ | Default download path when adding torrents to qBittorrent. |
124
+ | Download | `DefaultCategory` | No (optional) | `jav` | Default category in qBittorrent. |
125
+ | Download | `DefaultTags` | No (optional) | `jav-manager` | Default tags for created downloads. |
126
+ | LocalCache | `Enabled` | No (optional) | `true` | Enable or disable local cache storage. |
127
+ | LocalCache | `DatabasePath` | No (optional) | _(empty)_ | JSON cache file path (leave empty for default `jav_cache.json` next to executable). |
128
+ | LocalCache | `CacheExpirationDays` | No (optional) | `0` | Cache TTL in days (0 disables expiration). |
129
+ | Console | `Language` | No (optional) | `en` | UI language (`en` or `zh`). |
130
+ | Console | `HideOtherTorrents` | No (optional) | `true` | Hide non-matching torrents in list. |
131
+ | Telemetry | `Enabled` | No (optional) | `true` | Enable or disable anonymous telemetry. |
132
+ | Telemetry | `Endpoint` | No (optional) | `https://jav-manager.techfetch.dev` | Base endpoint (the app posts to `/api/telemetry` and `/api/javinfo`). |
133
+ | Update | `Enabled` | No (optional) | `true` | Enable or disable update checks. |
134
+ | Update | `AutoCheckOnStartup` | No (optional) | `true` | Auto-check for updates on startup (GUI). |
135
+ | Update | `GitHubRepo` | No (optional) | `jqknono/jav-manager` | GitHub repo used for update checks. |
136
+
137
+ Notes:
138
+ - `JavInfoSync:*` is a legacy section name; newer builds use `Telemetry:*` (the app still reads the legacy keys for backward compatibility).
139
+ - Advanced: configuration also supports environment variables with the `JAVMANAGER_` prefix (nested keys use `__`), but file-based config is the primary supported method.
140
+
141
+ ## Usage
142
+
143
+ ```bash
144
+ # Install dependencies (once)
145
+ cd JavManager
146
+ npm install
147
+
148
+ # GUI (default when no args)
149
+ npm run gui
150
+
151
+ # Console (interactive)
152
+ npm run cli
153
+
154
+ # Console (non-interactive)
155
+ npm run cli -- STARS-001
156
+
157
+ # Show help
158
+ npm run cli -- help
159
+
160
+ # Show version
161
+ npm run cli -- version
162
+ ```
163
+
164
+ ## Build & Package
165
+
166
+ ```bash
167
+ # Build
168
+ cd JavManager
169
+ npm run build
170
+
171
+ # Run (compiled)
172
+ npm run start
173
+ ```