{"id":48740795,"url":"https://github.com/tmd-0x5a/linkori","last_synced_at":"2026-04-19T05:02:42.357Z","repository":{"id":349666184,"uuid":"1202424673","full_name":"tmd-0x5a/linkori","owner":"tmd-0x5a","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-12T05:52:21.000Z","size":4274,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-12T07:05:32.071Z","etag":null,"topics":["comic-reader","desktop-app","manga","manga-reader","nextjs","rust","tauri","typescript","windows","zip"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tmd-0x5a.png","metadata":{"files":{"readme":"README.ja.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":null,"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-04-06T02:27:02.000Z","updated_at":"2026-04-12T05:52:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tmd-0x5a/linkori","commit_stats":null,"previous_names":["tmd-0x5a/linkori"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/tmd-0x5a/linkori","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmd-0x5a%2Flinkori","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmd-0x5a%2Flinkori/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmd-0x5a%2Flinkori/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmd-0x5a%2Flinkori/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tmd-0x5a","download_url":"https://codeload.github.com/tmd-0x5a/linkori/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmd-0x5a%2Flinkori/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31995167,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"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":["comic-reader","desktop-app","manga","manga-reader","nextjs","rust","tauri","typescript","windows","zip"],"created_at":"2026-04-12T07:02:39.183Z","updated_at":"2026-04-19T05:02:42.350Z","avatar_url":"https://github.com/tmd-0x5a.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"﻿# Linkori\n\n[English](README.md) | **日本語**\n\nプレイリストで複数フォルダ・ZIPを連続閲覧できるローカル漫画ビューア。\n\n**[公式サイト](https://tmd-0x5a.github.io/linkori/)** | **[ダウンロード](https://github.com/tmd-0x5a/linkori/releases/latest)**\n\n## スクリーンショット\n\n**プレイリスト画面**\n![プレイリスト画面](docs/プレイリスト画面.png)\n\n**ファイルブラウザ**\n![ファイルブラウザ](docs/ファイルブラウザ.png)\n\n**ビューア画面**\n![ビューア画面](docs/ビューア画面.png)\n\n## ダウンロード\n\n[**Releases**](https://github.com/tmd-0x5a/linkori/releases) ページから最新の `Linkori_x.x.x_x64-setup.exe` をダウンロードしてください。\n\n| ファイル | 説明 |\n|---|---|\n| `Linkori_x.x.x_x64-setup.zip` | インストーラー（推奨）— 解凍後 `setup.exe` を実行 |\n| `Linkori_x.x.x_x64_en-US.zip` | MSI インストーラー — 解凍後 `.msi` を実行 |\n\n### 動作環境\n- Windows 10 / 11（x64）\n- WebView2 ランタイム（Windows 11 は標準搭載、Windows 10 は自動インストール）\n\n---\n\n## 機能\n\n### プレイリスト管理\n- プレイリストの作成・削除・名前変更\n- プレイリストはローカルストレージに自動保存（アプリ再起動後も維持）\n- 複数プレイリストの切り替え\n- **ドラッグで並び替え**（v0.4.0）: プレイリストアイテムのどこでもドラッグして並び替え可能（専用ドラッグハンドル不要）\n- **右クリックで名前変更・削除メニューを表示**\n- ダブルクリックでその場で名前変更\n- `F2` で選択中のプレイリストをリネーム、`Delete` で削除確認ダイアログを表示\n- **お気に入り**: プレイリストをスターで登録してフィルタバーの ★ ボタンで絞り込み\n- **カスタムタグ**: プレイリストに任意のテキストタグを付与。フィルタバーのタグ（#tag）クリックで絞り込み\n- **既読/未読ステータス**: 右クリックメニューから「未読」「既読」「未設定」を設定可能\n- **閲覧進捗バー**: 各プレイリストアイテムに読み進めた進捗率をバー表示\n\n### チャンク（読書範囲）\n- 開始ファイル〜終了ファイルの範囲を「チャンク」として登録\n- **複数選択＆グループドラッグ**（v0.4.0）: クリックで単一選択・`Ctrl+クリック` でトグル・`Shift+クリック` で範囲選択・ドラッグで範囲選択し、まとめてドラッグ。DragOverlay によって選択チャンクが積み重なったカード（件数バッジ付き）として同時移動\n- チャンクをドラッグ＆ドロップで並び替え\n- ディレクトリ内の画像・ZIPファイル内の画像どちらも対応\n- 複数チャンクを連結して1つのプレイリストとして閲覧可能\n- **開始パスにフォルダ・ZIPを指定すると、そのフォルダ/ZIP全体を対象にできる**（終了パス不要）\n- ZIP内サブディレクトリの指定にも対応\n- **右クリックで編集・削除メニューを表示**（常時表示ボタンを廃止してUIをすっきりさせた）\n- **逆順表示**: 終了ファイルが開始ファイルより前（例: `027.jpg` → `001.jpg`）の場合、画像を逆順で提供\n- **プレビュー**: チャンクカードの目のアイコンをクリックすると、ビューアを開く前にサムネイルで画像を確認可能\n- **枚数バッジ**: 各チャンクカードに画像枚数を表示\n- **チャンクソート**: アクティブプレイリスト内のチャンクをソートメニューから名前・更新日時・作成日時（昇順/降順）で並び替え\n- **サブフォルダで分割**: 1チャンクをサブフォルダ単位の複数チャンクに分割。アンドゥで元に戻すことも可能\n- **一括削除**: 複数チャンクを選択してまとめて削除。`Ctrl+Z` で最後の削除を復元\n\n### ファイルブラウザ（オリジナルエクスプローラー）\n- OS準拠のネイティブダイアログを使わず、アプリ内蔵のエクスプローラーでファイル選択\n- **左サイドバー**にPC上の全ドライブを動的表示（実在するドライブのみ）\n- **クイックアクセス**: デスクトップ・ダウンロード・ドキュメント・ピクチャ・ビデオ・ミュージックへのショートカット\n- アドレスバー（パンくずリスト）をクリックして直接パス入力可能\n- **検索**: 検索ボックスで表示ファイルをファイル名で絞り込み\n- **表示モード切り替え**：リスト表示 / グリッド表示（サムネイル大）\n- **ソート**：名前順・更新日時順、昇順/降順をカラムヘッダークリックで切り替え（ソート順・表示モードはパス移動後やダイアログを閉じても記憶）\n- 更新日時をリスト表示の列として表示\n- **隠しファイル切替**: 表示/非表示をトグル\n- ディレクトリ・ZIPファイル（.zip / .cbz）の階層ナビゲーション\n- ZIP内サブディレクトリへの入り込みに対応\n- Shift-JIS（CP932）エンコードのファイル名を正しく表示（日本語 ZIP 対応）\n- サムネイル遅延読み込み\n- 「このフォルダを選択」「このZIPを選択」ボタンでフォルダ・ZIP丸ごと選択可能\n- **終了パス制限**: 終了パスの選択は開始パスと同じフォルダ/ZIP内のみに制限\n\n### 言語切り替え\n- 設定メニューから UI 言語を **日本語 / English** に切り替え可能\n- 言語設定は次回起動時にも引き継がれます\n\n### ビューア\n- **1枚表示 / 2枚見開き表示** を切替可能\n- 右→左読み（日本の漫画）固定\n- ページ遷移アニメーション\n- フルスクリーン表示\n- **高速起動**: ビューアを開いた瞬間に表示を開始 — 画像は読み進めながら必要なページのみ読み込む遅延読み込み方式。大量画像のプレイリストや大型ZIPでも待ち時間なし\n- **閲覧位置の記憶**: ホームに戻っても、プレイリストごとに最後に見ていたページと表示設定（1枚/2枚表示）を自動保存・復元。アプリを閉じても次回起動時に引き継ぎ\n- **シークバーサムネイル高速化**: 現在ページ付近から優先的にサムネイルを生成。既に読み込み済みの画像はブラウザ側で即座にリサイズするためIPC不要\n- **部分失敗時の警告**: 一部チャンクが読み込めなくても残りが表示できる場合は、ビューア上部に閉じられる警告バナーを表示して失敗したチャンクを通知 — 他のチャンクはそのまま閲覧可能\n\n#### 操作方法\n\n| 操作 | 動作 |\n|------|------|\n| マウスホイール ↓ | 次ページ |\n| マウスホイール ↑ | 前ページ |\n| `←` / `↑` | 次ページ |\n| `→` / `↓` | 前ページ |\n| `Space` | 次ページ |\n| `Shift + Space` | 前ページ |\n| `PageDown` | 次ページ |\n| `PageUp` | 前ページ |\n| `Home` | 最初のページへ |\n| `End` | 最後のページへ |\n| `S` | 1枚 / 2枚 切替 |\n| `[` | 次のチャンクへ |\n| `]` | 前のチャンクへ |\n| `F` | フルスクリーン切替 |\n| `Esc` | フルスクリーン解除 / ホームに戻る |\n| 画面右半分クリック | 前ページ |\n| 画面左半分クリック | 次ページ |\n\n#### ページバー（下部・ホバーで表示）\n- 残りページ数・現在ページ / 全ページ数 を表示\n- プログレスバー（右→左方向）をドラッグ or クリックでシーク\n- **チャンク可視化**: プログレスバー上にチャンク境界のティックマークを表示 — クリックでそのチャンクの先頭へジャンプ\n- **チャンクナビボタン**: プログレスバーの両端に前・次チャンクボタンを表示\n- 複数チャンクのプレイリストでは現在のチャンク名（またはチャンク番号）を中央に表示\n\n## 対応画像フォーマット\n\nJPEG / PNG / GIF / WebP / BMP / TIFF / **PDF**\n\n## 対応アーカイブ\n\n`.zip` / `.cbz`（ZIP内画像・ZIP内ディレクトリに対応）\n\n## 画像の配信方式（manga:// プロトコル）\n\nLinkori はローカル画像をビューアに表示するために、独自の `manga://` プロトコルを使用しています。\n\n通常のブラウザは `file://` でローカルファイルを直接読み込めますが、Tauri のセキュリティ制限により `\u003cimg src=\"C:\\manga\\001.jpg\"\u003e` のようにファイルパスを直接指定することができません。そのため、Rust 側で `manga://` から始まる URL を受け取り、対応する画像データをメモリ上で返す仕組みになっています。\n\n```\n\u003cimg src=\"manga://localhost/C:/manga/ch01/001.jpg\"\u003e\n           ↓ Rust がリクエストを受け取り\n           ↓ ディスクまたは ZIP から画像バイト列を読み込んで返す\n```\n\nZIP ファイル内の画像も同様に `manga://` 経由で配信されるため、ZIP を展開せずにそのまま表示できます。\n\n## セキュリティ\n\n- **Zip Slip 対策**: ZIPエントリパスの `..` トラバーサルを検出・拒否\n- **パストラバーサル対策**: `manga://` プロトコルハンドラーおよびチャンク解決時にパス検証を実施\n- **ファイルサイズ上限**: ZIP展開時に 200MB の上限を設定（DoS対策）\n- **CSP**: `manga://` プロトコルのみを `img-src` に許可\n\n## データ保存場所\n\nプレイリスト・チャンクデータはローカルに保存されます。\n\n```\nC:\\Users\\\u003cユーザー名\u003e\\AppData\\Roaming\\com.linkori.app\\\n```\n\nアンインストール後もデータは残ります。完全に削除したい場合は上記フォルダを手動で削除してください。\n\n---\n\n## 免責事項\n\n- 本ソフトウェアは現状有姿（AS IS）で提供されます。\n- 使用によって生じたいかなる損害についても、作者は責任を負いません。\n- 著作権で保護されたコンテンツの取り扱いは、ユーザー自身の責任において適法に行ってください。\n- 本ソフトウェアはローカル環境のみで動作し、外部サーバーへのデータ送信は一切行いません。\n\n---\n\n## ライセンス\n\nMIT License\n\n---\n\n## 開発\n\n```bash\n# フロントエンド開発サーバー\nnpm run dev\n\n# Tauri 開発（ホットリロードあり）\nnpm run tauri dev\n\n# プロダクションビルド\nnpm run build\nnpm run tauri build\n```\n\n### 必要環境\n- Node.js\n- Rust / Cargo\n- Tauri v2 CLI\n\n---\n\n## 変更履歴\n\n### v0.5.0\n- **ビューア内チャンク編集パネル**: ビューアを開いたまま右からスライドインするサイドバーでチャンクの追加・編集・削除・並び替え・サブフォルダ分割ができるように。変更後は閲覧位置を保持したまま画像リストを再構築するため、読んでいる途中でチャンク構成を組み替えても現在ページが飛びません。\n- **タグ色システム**: 各タグに色を紐付けできるように。プレイリストに付与された最初の色付きタグがカード全体を淡い色で染めます（ホバー・選択時は従来のブルーに切り替わるので操作フィードバックと両立）。従来の「プレイリストごとの背景色」ピッカーは廃止し、色はタグ経由で設定する方式に統一しました。\n- **17色パレット**: 使える色を 6 色から 17 色へ拡張（ブルー系・グリーン系・ウォーム系・パープル系・ニュートラル系）。\n- **タグエディタ刷新**: タグ追加と同じパネル上で色を選択可能に。既存タグはクリックでインラインで色変更できます。タグピルの `#` プレフィックス表示を廃止。\n- **ダークモード調整**:\n  - チャンクカード選択時の背景を半透明ブルーに変更（以前は白系だったためダークモードで文字が白く溶けていました）。\n  - ボタンホバー時の文字色を濃色に固定し、イエロー/シアン系ホバー背景で白文字が見えなくなる問題を解消。\n  - `.btn-clay` のハードシャドウをダークモード用に反転。\n- **インストーラー**:\n  - NSIS インストーラーで日本語言語セレクタを表示。\n  - `%LOCALAPPDATA%`（ユーザー単位）へインストールすることで UAC 昇格プロンプトを不要に。\n  - `shortDescription` / `publisher` / `copyright` 等のメタデータを整備。\n\n**Windows SmartScreen の警告について**: 現状の インストーラーと `.exe` は未署名のため、Windows SmartScreen に「認識されないアプリ」警告が表示されます。**詳細情報 → 実行** をクリックすれば起動できます。警告を完全に消すには Authenticode コード署名証明書が必要で、現時点では対応していません。\n\n### v0.4.0\n- プレイリストの「どこでもドラッグ並び替え」（専用ハンドル廃止）。\n- チャンクの複数選択・グループドラッグ（件数バッジ付き DragOverlay）。\n- チャンクプレビュー、枚数バッジ、名前・日付ソート。\n- サブフォルダ分割（アンドゥ対応）、一括削除（`Ctrl+Z` 復元）。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmd-0x5a%2Flinkori","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftmd-0x5a%2Flinkori","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmd-0x5a%2Flinkori/lists"}