zfsjlll

zfsjlll

趁着年轻,好好犯病

家庭向けストリーミングソリューション - Jellyfin、私には独自の使い方があります

back

前回の ITX ホストのアップグレード + 清掃記録 に続き、ハードウェアレベルのメンテナンスを行い、最近、ソフトウェアレベルで家庭用ストリーミングサービス Jellyfin を最適化しました。これにより、Jellyfin は真の意味での NAS となり、映画やアニメの視聴だけでなく、家庭の画像、動画、書籍、ポッドキャストなどの保存も可能になりました。

NAS はウィキペディアで次のように定義されています:ネットワーク接続ストレージ (NAS) は、ファイルレベル(ブロックレベルストレージに対して)コンピュータデータストレージサーバーであり、コンピュータネットワークに接続され、異種クライアントグループにデータアクセスを提供します。「NAS」という用語は、関与する技術やシステム、またはそのような機能のために構築された専門デバイスの両方を指すことができます(局所エリアネットワークなどの関連技術とは異なり、NAS デバイスは通常、単一のユニットです)。

翻訳:ネットワーク接続ストレージ(NAS)は、ファイルレベル(ブロックレベルストレージに対して)のコンピュータデータストレージサーバーであり、コンピュータネットワークに接続され、異種クライアントグループにデータアクセスを提供します。「NAS」という用語は、関与する技術やシステム、またはそのような機能のために構築された専門デバイスを指すことができます(局所エリアネットワークなどの関連技術とは異なり、NAS デバイスは通常、単一のユニットです)。

したがって、一般的に言われる NAS デバイスだけでなく、対応する機能を実現するソフトウェアやシステムもこのように呼ばれることがあります。例えば、私の NAS は 24 時間稼働している Win11 ホスト上で動作しています。したがって、この記事は Win11 環境に基づいて設定されています。

デプロイメントプラン#

Nastools + Jackett + Qbittorent + ChineseSubFinder + Jellyfin

上記のすべてのサービスは Windows 上に直接デプロイできます。

実現機能#

  • Jackett を使用して BT サイトをインデックスし、Nastools にフィードバックして映画、番組(バラエティ、ドラマ、アニメ)を TMDB API でスクレイピングします(私は BT 愛好者で、PT をいじる余裕はありませんが、NASTools に内蔵されているインデクサーサイトは少なく、主にアニメサイトで、映画のニーズを満たすことができないため、Jackett を導入してインデックスサイトを増やします)。
  • NASTools、Qbittorrent ツールを利用してメディアファイルを一括ダウンロードおよび整理します。
  • ChineseSubFinder を使用して自動的に中国語字幕をダウンロードします。
  • ハードウェアトランスコードによるメディア再生の加速。

具体的なデプロイ方法はこの記事の重点ではなく、ネット上には大量のチュートリアルがありますので、いくつかの高度な操作を共有し、より多くの人々に役立つことを願っています。

ファイルの移動方法についてのハードリンク、ソフトリンクなどの概念は、名詞解説 - 移動方法を参照してください。

NASTools を使用してハードリンクを簡単に実現できますが、時々アニメの字幕グループのファイル名や無関係なファイルのためにメタデータを認識できないことがありますので、ここでは手動で行う必要があります。ここでは Python でスクリプトを書き、自動化の理念を実現しました。

ディレクトリ構造:

[DBD-Raws][孤独摇滚!][01-12TV全集+特典映像][1080P][BDRip][HEVC-10bit][简繁外挂][FLAC][MKV]
├── CDs
│   ├── 01
│   │   ├── 01 ふらふら.flac
│   │   ├── 02 来世でがんばります.flac
import os

# あるディレクトリ内のすべてのファイルのハードリンクを別のディレクトリに作成する
def create_hard_links(folder, new_folder):
    # アニメの主ファイルフォルダが存在しない場合は作成する
    while not os.path.exists(new_folder):
        os.mkdir(new_folder)
    # フォルダ内のすべてのファイルを遍歴する
    for file_name in os.listdir(folder):
        try:
            file_path = os.path.join(folder, file_name)
            # フォルダの場合は再帰的に関数を呼び出す
            if os.path.isdir(file_path):
                # 同時にそのフォルダも作成する、ハードリンクはフォルダをリンクできないため
                new_folder_path = os.path.join(new_folder, file_name)
                os.mkdir(new_folder_path)
                create_hard_links(file_path, new_folder_path)
            else:
                new_file_path = os.path.join(new_folder, file_name)
                # ファイルがすでに存在する場合は、サフィックス“_copy{n}”を追加する、例えば複数の“cover.jpg”がある場合、“cover_copy1.jpg”、“cover_copy2.jpg”などと命名する
                while os.path.exists(new_file_path):
                    print(f"{new_folder}でサフィックス“_copy”を追加するために{file_name}の名前を変更しています")
                    count = 1
                    file_name_without_extension, file_extension = os.path.splitext(file_name)
                    new_file_name = f"{file_name_without_extension}_copy{count}{file_extension}"
                    count += 1
                    new_file_path = os.path.join(new_folder, new_file_name)
                os.link(file_path, new_file_path)
                print(f"リンク成功!{anime_dir}を見に行ってくださいo(* ̄▽ ̄*)ブ!")
        except (FileNotFoundError, PermissionError) as e:
            print(f"エラーが発生しました: {str(e)}")

# 使用例
anime_name="孤独摇滚(2020)1"
# NASTools設定の二次ディレクトリ
category = ["アニメ" , "完結アニメ"]
# suffix = "CDs"
anime_dir = f"D:\TV\Anime\{category[1]}\{anime_name}"
# os.mkdir(anime_dir)
source_folder = r'D:\Media_download\[DBD-Raws][孤独摇滚!][01-12TV全集+特典映像][1080P][BDRip][HEVC-10bit][简繁外挂][FLAC][MKV]\Fonts'
new_folder = rf'{anime_dir}'
create_hard_links(source_folder, new_folder)

スクリプトダウンロード🔗:hlink.py

字幕最適化#

カスタム字幕#

【コンソール】->【再生】->【代替フォントファイルパス】、【代替フォントを有効にする】にチェックを入れます。

自定义字幕

フォーマット変換#

字幕グループが提供するフォントは多くが.otf,.ttf などで、ファイルサイズが最大で 27MB 近くになります。これは WEB 伝送にとってかなりの負担です。Jellyfin の公式文書を参考にすると、.woff2 フォーマットを使用できることがわかります。これは Web 開発で使用される効率的なフォント圧縮フォーマットで、実際に元の 50% に圧縮できます。fontTools を使用して、Google の Brotli 圧縮アルゴリズムを用いてフォントを一括変換します。従来の圧縮アルゴリズム(gzip など)と比較して、Brotli は同じ圧縮率でより高速な解凍速度を実現できます。

Fallback Fontsオプションは、現在 Web クライアントによって字幕をレンダリングするためにのみ使用されています。これをこの目的のためのフォントを含むフォルダに設定できます。これらのフォントの合計サイズは 20MB に制限されています。woff2 のような Web 向けに最適化された軽量フォーマットが推奨されます。

翻訳:Web クライアントは現在、Fallback Fonts オプションを使用して字幕を表示しています。これをフォントを含むフォルダに設定できます。これらのフォントの合計サイズは 20MB に制限されています。woff2 などの Web 向けに最適化された軽量フォーマットの使用が推奨されます。

画像説明 圧縮前 画像説明 圧縮後

変換スクリプトは以下の通りです。

from fontTools.ttLib import TTFont
import brotli
import os

def convert_fonts_in_directory(input_dir):
    for file in os.listdir(input_dir):
        if os.path.isdir(os.path.join(input_dir, file)):
            convert_fonts_in_directory(os.path.join(input_dir, file))
            # ファイルの拡張子が.otf/.ttfの場合
        elif file.lower().endswith((".otf", ".ttf")):
            input_file = os.path.join(input_dir, file)
            output_file = os.path.join(output_dir, os.path.splitext(file)[0] + ".woff2")
            convert_otf_to_woff2(input_file, output_file)
        else:
            print(f"ファイル{file}は.otf/.ttfファイルではありません")

def convert_otf_to_woff2(input_file, output_file):
    # フォントファイルを開く
    font = TTFont(input_file)

    # フォントを.woff2ファイルとして保存する
    font.save(output_file, 'woff2')

    # .woff2ファイルを圧縮する
    with open(output_file, 'rb') as f:
        woff2_data = f.read()

    compressed_data = brotli.compress(woff2_data)

    # 圧縮されたデータを.woff2ファイルとして保存する
    with open(output_file, 'wb') as f:
        f.write(compressed_data)
    print(f'変換成功!彼らは{output_dir}で静かにあなたを待っていますよ!(*^▽^*)')

# 入力と出力のディレクトリ 
input_dir = r'D:\ファイル転送\Fonts\1'
output_dir = r'D:\ファイル転送\Fonts\1'
# 関数を呼び出して変換を実行
convert_fonts_in_directory(input_dir)

スクリプトダウンロード🔗:convert_to_woff2.py

フォーマット変換後、フォントは基本的にニーズを満たすことができます。さらに圧縮が必要な場合は、フォントサブセット化を参照してください。

エピソード表示順序#

アニメの特典ファイルをスクレイピングする際、TMDB のメタデータの構造と字幕グループの命名順序が異なるためにスクレイピングが失敗することがあります。例えば、『とにかく非常に可愛い - 女子高校生編』は TMDB では特典編の 16-19 話に配置されています。

特典篇

一方、雲光字幕グループの構造は次のようになっています👇

雲光字幕グループ女子高校編

これに対して、2 つの解決策があります。

  1. S00E16-S00E19 にリネームしてスクレイピングを行う。
  2. TMDB のエピソードグループのメタデータを理解する。

Eposide Group

Highschool

Jeltfin での対応設定:エピソードを選択 -> メタデータを編集すれば、スクレイピングが実現できます。

表示順序

また、TMDB API を通じて取得することもでき、手動編集が便利です。

GET
https://api.themoviedb.org/3/tv/{series_id}/episode_groups

ポッドキャストのスクレイピング#

Jellyfin にはポッドキャストカテゴリがありませんが、音楽ライブラリや書籍ライブラリを通じて実現できます。ただし、対応するメタデータのスクレイピングは少ないかもしれませんが、無いよりはましです。

ディレクトリ構造を整えると、Jellyfin は自動的にスクレイピングします。例えば、BBC Sound の最新エピソード「Trump Trial… Donald Found Guilty!」は、音楽ライブラリの構造を「Music - Some Artist - Album a - music.mp3」とすることをお勧めします。

Americast

現在、ポッドキャストのスクレイピングに適したプラグインは見つかっていません。NASTools は映画とエピソードのスクレイピングのみをサポートしていますので、推奨があれば教えてください。今後の誰かの記事の材料を提供するために(冗談です)。

参考資料(順位は無関係)#

  1. Jellyfin の落とし穴ガイド(継続的に更新中) - 冰音 Project (9bingyin.com)
  2. 思源宋体、評価、正しい使用法 - 少数派 (sspai.com)
  3. Jellyfin Docs
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。