Coder Social home page Coder Social logo

kounoike / konomitv Goto Github PK

View Code? Open in Web Editor NEW

This project forked from tsukumijima/konomitv

0.0 2.0 0.0 21 MB

KonomiTV: Kind and Optimized Next On-broadcasting watching and Management Infrastructure for TV

License: MIT License

JavaScript 0.51% HTML 0.19% Vue 40.65% TypeScript 6.19% SCSS 1.11% Python 50.82% Dockerfile 0.53%

konomitv's Introduction

KonomiTV


いろいろな場所とデバイスでテレビと録画を快適に見れる、モダンな Web ベースのソフトウェアです。

ユーザーのさまざまな好みがつまった、温かみのある居心地の良い場を作ってみたいという想いから、KonomiTV と名付けました。
手元の PC・タブレット・スマホをテレビにすることを考えたときに、まったく新しく、使いやすくて快適な視聴体験を創出したいという想いから開発しています。

計画はかなり壮大ですが、現時点ではテレビをリアルタイムで視聴できる「テレビをみる」のみが実装されています。
将来的には、録画した番組を Netflix をはじめとした配信サイトのような UX で快適に視聴できる「ビデオをみる」など、多くの機能を追加予定です。

設計**

いわゆる TS 抜きでテレビを見ている人の多くが、TVTest でテレビを見て、録画をファイルベースで管理して、録画ファイルをメディアプレイヤーで開いて…といった、ファイルやアーキテクチャベースの視聴の仕方をされているかと思います。
ですが、その中で必ず出てくる BonDriver を選択したり、ファイルをフォルダの中から探しだして選択したり、1話を見終わったから2話を開き直したりといった手間は、本来その番組を視聴し、心いくまで楽しむにあたって、不要な工程ではないかと考えます。雑念、といったほうが分かりやすいでしょうか。

一方世間のトレンドに目を向けてみると、Netflix や Amazon Prime Video のような配信サイトが幅を利かせています。
これらのサイトが流行っているのは、(良い意味で)何も考えなくても、いつでもどこでも気軽に快適に映像コンテンツを見まくれる、そんなユーザー体験が実現されているからです。
配信サイトとテレビ・録画は「リアルタイムで配信されている」「事前に選んだコンテンツしか視聴できない」など大きな差異もありますが、映像コンテンツを視聴するインターフェイスという点では共通しています。
そこで、テレビと録画の視聴といういまだレガシーな視聴体験が残っている分野に、優れた UX を実現している配信サイトでの概念を取り入れ、まるで自分だけの Netflix のような視聴体験を演出できれば面白いのではないか?と考えました。その仮説と理想を実現すべく、鋭意開発を続けています。

こうした考えから、設計**として「映像コンテンツを視聴し楽しむ」ために不要な概念や操作を可能なかぎり表層から排除・隠蔽し、ユーザーが本当の目的以外の雑念に気を取られないようなシステムを目指しています。

たとえば TVRemotePlus であった「ストリーム」の概念を KonomiTV では排しています。チャンネルをクリックするだけですぐに視聴できるほか、裏側ではチューナーの共有、同じチャンネルを複数のデバイスで見ているなら自動的に共聴するといった高度な仕組みも備え、ユーザーがストレスなく視聴できるように設計されています。
画質の切り替えの UI も、KonomiTV では多くの動画サイトと同じようにプレイヤー内に統合されています。裏側では毎回エンコーダーを再起動しているのですが、表層からはあたかも事前に複数の画質が用意されているかのように見えるはずです。
一般的な PC で動かす以上使えるリソースには限界がありますし、全てにおいて Netflix のような機能を実装できるわけではありません。それでも使えるリソースの範囲で最大限使いやすいソフトウェアにしていければと、細部に様々な工夫を取り入れています。

当然ながら表に泥臭い処理を見せないようにしている分、裏側の実装がそれなりに大変です。細かいところまで調整しているとかなりの手間がかかります。
それでも私が頑張れば私を含めたユーザーの視聴体験が向上するわけで、必要な犠牲かなと思っています。

備考・注意事項

  • 現在 α 版で、まだ実験的なプロダクトです。当初よりかなり安定してきましたが、まだ保証ができる状態ではありません。
    • まだ安定しているとは言えませんが、それでも構わない方のみ導入してください。
    • 使い方などの説明も用意できていないため、自力でトラブルに対処できるエンジニアの方以外には現状おすすめできません。
    • 今後インストーラーを開発予定ですが、後述の通り現時点ではインストール方法がかなり煩雑になっています。他の環境でちゃんと動作するのかさえも微妙です。
    • 完成予想はおろか、TVRemotePlus で実装していた機能に関してもまだ完全にカバーできていないため、現時点で TVRemotePlus を代替できるレベルには達していません。
  • TVRemotePlus の後継という位置づけのソフトですが、それはあくまで「精神的な」ものであり、実際の技術スタックや UI/UX は完全に新規設計となっています。
    • 確かに TVRemotePlus の開発で得られた知見を数多く活用していますし開発者も同じではありますが、ユーザービリティや操作感は大きく異なると思います。
    • TVRemotePlus の技術スタックでは解決不可能なボトルネックを根本的に解消した上で、「同じものを作り直す」のではなく、ゼロから新しいテレビ視聴・録画視聴のユーザー体験を作り上げ、追求したいという想いから開発しています。
    • どちらかというと録画視聴機能の方がメインの予定でいますが、前述のとおり、現時点ではテレビのライブ視聴機能のみの実装です。構想は壮大ですが、全て実装し終えるには年単位で時間がかかるでしょう。
  • 今のところ、スマホ・タブレットは横画面表示のみ対応しています。将来的には縦画面でも崩れずに表示できるようにする予定です。
    • タブレットは Fire HD 10 (2021), iPad mini 4, iPad mini 6 で動作することを確認済みです。
    • スマホ(横画面)は実験的なもので、今後 UI が大幅に変更される可能性があります。
    • iPhone は Media Source Extensions API に対応していないため、現時点では動作しません。
      • 今後 LL-HLS 再生モードを実装する予定ですが、私が iPhone を常用していない事もあり、実装時期は未定です。
      • また、iPad でホーム画面に追加したアイコンから単独アプリのように起動した場合も (PWA)、同様に動作しません。
  • 今後、開発の過程で設定や構成が互換性なく大幅に変更される可能性があります。
  • ユーザービリティなどのフィードバック・不具合報告・Pull Requests (PR) などは歓迎します。
    • 技術スタックはサーバー側が Python + FastAPI + Tortoise ORM + Uvicorn 、クライアント側が Vue.js + Vuetify の SPA です。
      • Vuetify は補助的に利用しているだけで、大部分は独自で書いた SCSS スタイルを適用しています。
    • コメントを多めに書いているので、少なくとも TVRemotePlus なんかよりかは読みやすいコードになっている…はず。
    • 他人が見るために書いたものではないのであれですが、一応自分用の開発資料DB設計的なメモを公開しておきます。もし PR される場合などの参考になれば。


動作環境

Python 3.9 がインストールされた Windows 10 Pro で開発と動作確認を行っています。
asyncio を多用しているため、3.8 以前ではまともに動かない可能性が高いです。

Linux (Ubuntu 20.04 LTS x64) で動作することも確認しました
ただし Windows ほどあまり検証できていないので、環境によっては動かないことがあるかもしれません。
また、ARM 向けのサードパーティーライブラリの実行ファイルを同梱していないため、ARM 版の Linux では今のところ動作しません。

バックエンドは Mirakurun と EDCB から選べます。お使いの録画環境に合わせて選択してください。
仕組み上、チューナーオープンが遅い PLEX 製チューナーでは、EDCB バックエンドの方がチャンネル切り替えなどにかかる待機時間が速くなっています。

なお、チューナーのドライバとして px4_drv を利用している場合は、Mirakurun と EDCB での差はあまりありません。

Mirakurun バックエンドを利用する場合は、Mirakurun 3.9.0 以降が必要です。 3.8.0 以前でも動作しますが、おすすめはしません。
また、リバースプロキシを挟んでいるなどで Basic 認証が掛かっていると正常に動作しません。

EDCB バックエンドを利用する場合は、最新 (220122以降) の xtne6f 版 EDCB 、または tkntrec 版 EDCB が必要です。

EDCB 側のアップデートで、リモート PC で起動している KonomiTV から EDCB に接続できるようになりました!
もう KonomiTV と EDCB の両方が同じ PC 内で動いている必要はありませんし、Linux で起動した KonomiTV から EDCB に接続することもできるはずです。

さらに、EpgTimer / EpgTimerSrv にいくつか事前設定が必要です。

  • 「視聴に使用するBonDriver」に BonDriver を追加する (重要)
  • 「EpgTimerNWなどからのネットワーク接続を許可する」にチェックを入れる
  • xtne6f 版 EDCB の場合、「EpgTimerSrv の応答を tkntrec 版互換にする」にチェックを入れる (tkntrec 版 EDCB では既定で有効)
  • EpgDataCap_Bon の TCP 送信設定で「0.0.0.1:0」(SrvPipe) を追加する

このほか、EpgTimerSrv.exe にファイアウォールが掛かっているとネットワーク接続ができません。適宜ファイアウォールの設定を変更してください。

必須ではありませんが、Windows で PLEX 製チューナーを利用している場合は、事前にドライバを px4_drv for WinUSB に変更しておくことを推奨します。
px4_drv では公式ドライバと比べてチューナーの起動時間が大幅に短縮されています。その分 KonomiTV での視聴までにかかる待機時間も短くなるため、より快適に使えます。
px4_drv を導入すると、ほかにもドロップが大幅に減って動作が安定するなどの多くのメリットがあります。内蔵カードリーダーが使えないこと、BonDriver の差し替えが必要になることだけ注意してください。

インストール方法(暫定)

以下は暫定的なインストール方法です。
ただし、すべての環境でこの通りに進めて動くとは限りません。保証もできないので、すべて自己責任のもとでお願いします。

事前に Python 3.9 と pip がインストールされている事を前提とします。
なお、Microsoft ストアからインストールした Python では確実にまともに動作しません。

Windows の場合、インストール先をデフォルトの AppData 以下にするとそのユーザーしか使えなくなってしまいますが、とはいえ C:\Program Files 以下にインストールするとパッケージのインストールで管理者権限が必要になるので厄介です。個人的には C:\Applications\Python\Python3.9 あたりにインストールすることを推奨しておきます。

以下の手順では Windows では C:\Develop 、Linux では /Develop フォルダが作成されているものとして、C:\Develop または /Develop フォルダ以下にインストールするようになっています。
もし他のフォルダにインストールしたい場合は適宜読み替えてください。

以下はほとんどコマンドメモです。詳細な解説はありませんし、開発者向けです。
Windows では PowerShell にて実行してください。cmd.exe? 今すぐ窓から投げ捨てろ

Docker で構築する

あまり動作確認は取れていませんが、Docker で構築することもできます。あらかじめ、Docker と docker-compose がインストールされた環境が必要です。

ハードウェアエンコーダー (QSVEncC・NVEncC・VCEEncC) は Docker 上でも利用できます。ただし、ホスト OS が Linux である必要があるほか、あらかじめホスト OS に後述の GPU ドライバがインストールされている必要があります。
VCEEncC に関しても対応済みのつもりですが、手元に環境がないため、実際に動作するかどうかは検証できていません。

事前に、後述の設定ファイルの編集を行ってください。最低でも config.yaml が存在する状態にしておく必要があります。
あとは他のソフトウェアと同様に、docker-compose up を実行するだけです。

1. pipenv のインストール

pipenv は pip の環境を仮想化してくれるツールです。
pipenv を使えばパッケージをプロジェクトローカルにインストールできるので、依存関係の衝突などを気にする必要がありません。

python3.9 -m pip install pipenv

2. KonomiTV 本体のインストール

現時点では、Git で最新の release ブランチを取得することを推奨します。 release ブランチにはリリース済みの安定した変更のみが適用されます。
主にリリース時に更新されるので、定期的に git pull で最新化しておくことをおすすめします。

master ブランチは開発ブランチです。新しい機能をいち早く試せる反面、開発中の変更も多く含まれるため、安定する保証はありません。
また、サードパーティーライブラリの更新に依存する変更が行われることもあるため、サードパーティーライブラリを自前で更新する必要が出てくるかもしれません。

クライアント側は、不定期でビルド済みのファイルを client/dist/ に配置しています。
まだビルド済みのファイルに反映されていない変更を試してみたいときは、client/ フォルダで yarn build を実行するか、yarn dev で開発サーバーを起動させてください(後述)。

Windows

cd C:\Develop
git clone [email protected]:tsukumijima/KonomiTV.git
cd C:\Develop\KonomiTV\server
git switch release

Linux

cd /Develop
git clone [email protected]:tsukumijima/KonomiTV.git
cd /Develop/KonomiTV/server
git switch release

3. サードパーティーライブラリのインストール

TVRemotePlus では Git の管理下に含めていましたが、KonomiTV ではバージョン情報のみを管理する方針としています。
将来的にはインストーラー側で自動ダウンロード/アップデートするようにしたいところですが、現時点では手動でのダウンロードと配置が必要です。

Linux 向けの実行ファイルも同梱しています(拡張子: .elf )。Linux (Ubuntu 20.04 LTS x64) で動作することを確認しました。
なお、QSVEncC・NVEncC・VCEEncC を使う場合は、別途 ffmpeg (libav) ライブラリと Intel Media Driver / NVIDIA Graphics Driver / AMD Driver のインストールが必要です。
VCEEncC の Linux サポートはつい最近追加されたばかりなので、安定してエンコードできるかは微妙です(環境がない…)。

こちら からサードパーティーライブラリをダウンロードし、server/thirdparty/ に配置してください。 展開後サイズは 600MB あるので注意。

7z 、あるいは p7zip のコマンドライン版が利用できる場合は、コマンドラインでダウンロードと展開を行うこともできます。

curl -LO https://github.com/tsukumijima/KonomiTV/releases/download/v0.4.0/thirdparty.7z
7z x -y thirdparty.7z
rm thirdparty.7z

Windows では、C:\Develop\KonomiTV\server\thirdparty\FFmpegffmpeg.exe がある状態になっていれば OK です。

Linux では、/Develop/KonomiTV/server/thirdparty/FFmpegffmpeg.elf がある状態でかつ、実行ファイルが実行権限を持っている必要があります。
以下のコマンドを実行して、実行権限を付与してください。

chmod 755 ./thirdparty/FFmpeg/ffmpeg.elf
chmod 755 ./thirdparty/FFmpeg/ffprobe.elf
chmod 755 ./thirdparty/QSVEncC/QSVEncC.elf
chmod 755 ./thirdparty/NVEncC/NVEncC.elf
chmod 755 ./thirdparty/tsreadex/tsreadex.elf
chmod 755 ./thirdparty/VCEEncC/VCEEncC.elf

このほか、Linux では FFmpeg の実行に libv4l-dev パッケージが必要です(インストールされていないと FFmpeg が実行できないみたいです)。
お使いの環境にインストールされていない場合は、あわせてインストールしてください。

sudo apt install -y libv4l-dev

4. 依存パッケージのインストール

pipenv sync を実行し、KonomiTV が依存するパッケージをインストールしてください。
事前に PIPENV_VENV_IN_PROJECT 環境変数を定義してから実行してください。さもなければ、パッケージや仮想環境がまったく別のフォルダにインストールされてしまいます。

Windows

# pipenv のパッケージを直下に保存する環境変数を定義
# これをつけないと ~/.virtualenvs/ に置かれてしまい面倒
$env:PIPENV_VENV_IN_PROJECT = "true"
pipenv sync

Linux

# pipenv のパッケージを直下に保存する環境変数を定義
# これをつけないと ~/.local/share/virtualenvs/ に置かれてしまい面倒
export PIPENV_VENV_IN_PROJECT="true"
pipenv sync

5. データベースのアップグレード

Aerich という Tortoise ORM のマイグレーションツールを使っています。

以下のコマンドを実行して、データベースを更新してください。 まだデータベースが存在していない場合は、このタイミングで作成されます。
データベース構造が変更されるたびに、このコマンドを再実行する必要があります。

pipenv run aerich upgrade

よくわからないエラーが出てうまくアップグレードできないときは、一旦データベースを削除してからもう一度実行するとうまくいくことがあります。
今のところデータベースには再生成できるデータ(チャンネル情報・番組情報)しか保存されていないので、削除することによる影響はありません。

rm ./data/database.sqlite
pipenv run aerich upgrade

6. 設定ファイルの編集

ここまで手順通りにやっていれば Readme.md のあるフォルダに config.example.yaml があるはずなので、同じ階層に config.yaml としてコピーします。
設定ファイルは YAML ですが、JSON のようなスタイルで書いています。括弧がないとわかりにくいと思うので…

JSON は YAML のサブセットなので、実は JSON は YAML として解釈可能です。

バックエンドの設定

Mirakurun をバックエンドとして利用する場合は、Mirakurun の HTTP API の URL をお使いの録画環境に合わせて編集してください。

EDCB をバックエンドとして利用する場合は、EDCB (EpgTimerNW) の TCP API の URL をお使いの録画環境に合わせて編集してください。
通常、TCP API の URL は tcp://(EDCBのあるPCのIPアドレス):4510/ になります。接続できない際はファイアウォールの設定を確認してみてください。
前述の通り、あらかじめ EDCB の設定で「EpgTimerNWなどからのネットワーク接続を許可する」にチェックを入れておく必要があります。

TCP API の URL として tcp://edcb-namedpipe と指定すると、TCP API の代わりに名前付きパイプで通信を行います。

他にも設定項目がありますが、下記のエンコーダーの設定を除いて、ほとんど変更する必要はありません。設定を反映するにはサーバーの再起動が必要です。

エンコーダーの設定

エンコーダーには、ソフトウェアエンコーダーの FFmpeg のほか、ハードウェアエンコーダーの QSVEncC・NVEncC・VCEEncC を選択できます。
ハードウェアエンコーダーを選択すると、エンコードに GPU アクセラレーションを利用するため、CPU の使用率を大幅に下げる事ができます。
エンコード速度も高速になるため、お使いの PC で利用可能であれば、できるだけハードウェアエンコーダーを選択することを推奨します。

お使いの PC で選択したハードウェアエンコーダーが利用できない場合、その旨を伝えるエラーメッセージが表示されます。
まずはお使いの PC でハードウェアエンコーダーが使えるかどうか、一度試してみてください(設定ファイルの変更後はサーバーの再起動が必要です)。

前述のとおり、Linux 環境で QSVEncC・NVEncC・VCEEncC を利用する場合は、別途 GPU ドライバのインストールが必要です。

QSVEncC は Intel 製 CPU の内蔵 GPU に搭載されているハードウェアエンコード機能 (QSV) を利用するエンコーダーです。
ここ数年に発売された Intel Graphics 搭載の Intel 製 CPU であれば基本的に搭載されているため、一般的な PC の大半で利用できます。内蔵 GPU にも関わらず高速で、画質も良好です。

NVEncC は Geforce などの NVIDIA 製 GPU に搭載されているハードウェアエンコード機能 (NVENC) を利用するエンコーダーです。
高速で画質も QSV より若干いいのですが、Geforce では同時にエンコードが可能なセッション数が 3 に限定されているため、同時に 3 チャンネル以上視聴することはできません。
同時に 4 チャンネル以上視聴しようとした場合、KonomiTV では「NVENC のエンコードセッションが不足しているため、ライブストリームを開始できません。」というエラーメッセージが表示されます。

VCEEncC は Radeon などの AMD 製 GPU に搭載されているハードウェアエンコード機能 (AMD VCE) を利用するエンコーダーです。
QSVEncC・NVEncC に比べると安定せず、利用者も少ないため安定稼働するかは微妙です。QSVEncC・NVEncC が使えるならそちらを選択することをおすすめします。

なお、config.yaml が存在しなかったり、設定項目が誤っていると後述のサーバーの起動の時点でエラーが発生します。
その際はエラーメッセージに従い、config.yaml の内容を確認してみてください。

7. サーバーの起動

FastAPI をホストする ASGI サーバーである、Uvicorn を起動します。 現時点ではポート番号は固定で、ポート 7000 を使いリッスンします。
あらかじめ、ファイアウォールの設定でポート 7000 が開いているかどうか確認してください。

pipenv run serve

開発時などでリロードモード(コードを変更すると自動でサーバーが再起動される)で起動したいときは、pipenv run dev を実行してください。
コードを変更すると強制的にサーバーが再起動されるため、サーバーを終了するタイミングによっては EDCB のチューナーが終了されないままになることがあります。

Uvicorn はアプリケーションサーバーであり、KonomiTV の場合は静的ファイルの配信も兼ねています。
静的ファイル( SPA クライアント)は、client/dist/ に配置されているビルド済みのファイルを配信するように設定されています。
そのため、yarn build でビルドを更新したのなら、サーバー側で配信されるファイルも同時に更新されることになります。

クライアントは Vue.js で構築されており、コーディングとビルドには少なくとも Node.js が必要です。Node.js v14, npm v7, yarn v1 で開発しています。 クライアント側のデバッグは client/ フォルダにて yarn dev を実行し、ポート 7001 にてリッスンされるデバッグ用サーバーにて行っています。

事前に yarn install を実行して依存パッケージをインストールしておく必要があります。
以前は npm を使っていたのですが、GitHub からのパッケージの更新がなぜか激重のため、yarn に変更しました。
パッケージのインストールは遅いですが、今まで通り npm を使ってビルドすることもできます。

yarn dev を実行するとコードの変更時に自動的に差分が再ビルドされるため、毎回 yarn build を実行し直す必要がありません。
API サーバーは別のポート (7000) でリッスンされているので、開発時のみ API のアクセス先を同じホストのポート 7000 に固定しています。

起動してみて、何もエラーなく Application startup complete. と表示されていればインストール完了です!
ブラウザで http://localhost:7000/ にアクセスすると、KonomiTV のホーム画面が表示されるはずです。

初回起動時は Mirakurun または EDCB から7日間分の番組情報をすべて取得してデータベースに保存するため、起動に30秒以上かかります。
次回以降は差分のみをデータベースに保存・削除するので、最高でも10秒もすれば起動します。
番組情報の更新は今のところ15分に一度、バックグラウンドで自動的に行われます。ログにも出力されているはずです。

API ドキュメント (Swagger) は http://localhost:7000/api/docs にあります。
リンクはいろいろありますが、ほとんどがまだ未着手のため 404 になっています。テレビのライブ視聴機能だけで見ても、まだ実装できていない箇所が多いです。
とはいえ最低限視聴できる状態にはなっているはずです。まずは使ってみて、もしよければ感想をお聞かせください。

License

MIT License

konomitv's People

Contributors

tsukumijima avatar xtne6f avatar yude avatar dependabot[bot] avatar misonln41 avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.