# EMBArk - The firmware security scanning environment

# About

*EMBArk* is a tool for centralized firmware analyzing.
Scan, Identify, Track, Report.
Built to be simple but powerful.
It's the web-based enterprise interface for the firmware security scanner *EMBA*. It is developed to provide the firmware security analyzer *[EMBA](https://github.com/e-m-b-a/emba)* as a service with feature-packed UI and to improve accessibility to the firmware scanning backend *EMBA* regardless of the system and operating system.
Furthermore, *EMBArk* improves the data provision by aggregating the various scanning results in an [aggregated management dashboard](https://github.com/e-m-b-a/embark/wiki/Web-interface#main-dashboard).

[![Watch EMBArk](https://raw.githubusercontent.com/wiki/e-m-b-a/embark/static/images/EMBArk-YouTube.png)](https://youtu.be/viv-VoPf9os "Watch EMBArk")

# Important

* The new Tracking application currently doesn't work offline.
* The device, Vendor and version tracking aren't fully integrated into all dashboards yet.
* the only supported OS at this time is Ubuntu LTS (22.04)

## Quick-Start
`git clone https://github.com/e-m-b-a/embark.git; cd embark; sudo ./installer.sh -d`

`sudo ./run-server.sh [-a <IP/HOSTNAME>] [-h]`

## Automated setup on Ubuntu 22.04 LTS

1. Checkout the repository (e.g. `git clone https://github.com/e-m-b-a/embark.git`)
2. Change directory to root of the repository i.e `cd embark`
3. Run `sudo ./installer.sh -d ` to run the default installation.
4. Further details are available in the wiki (See [installation](https://github.com/e-m-b-a/embark/wiki/Installation))

*EMBArk* is using the firmware security scanner *EMBA* as backend. You can take a look at the [*EMBA*](https://github.com/e-m-b-a/emba) repository and get more [information about usage of *EMBA* in the wiki](https://github.com/e-m-b-a/emba/wiki/Usage). Additionally you should check the [*EMBArk* wiki](https://github.com/e-m-b-a/embark/wiki).

## Start Server
To start the EMBArk-Server simply run `$ sudo ./run-server.sh`.
This starts the http-Server on 0.0.0.0:80

Note: The default server name is "embark.local" and has to be resolved via host files or a DNS-server.\
If you want to query the server using an IP or other hostname please use the `-a` option. (multiple inputs supported)

## Upgrading
- Use the `export-DB.sh` to back up your database
- Just pull and restart
- Usually, upgrading does NOT require a reinstallation (reinstalling will delete all files and the database completely)
## Developer
For developers, we recommend simply using: `sudo ./installer.sh -F ` and the `./dev-tools/debug-server-start.sh` script.

## Get involved
The IoT is growing, the development is ongoing, and there are many new features that we want to add.
We welcome [pull requests](https://github.com/e-m-b-a/embark/pulls) and bug reports or feature requests via [issues](https://github.com/e-m-b-a/embark/issues) on GitHub.

## Acknowledgement
This project was originally initiated by [Siemens Energy](https://www.siemens-energy.com/) as [AMOS project](https://oss.cs.fau.de/teaching/the-amos-project/) in cooperation with the [FAU](https://oss.cs.fau.de/).

See also the original [*EMBArk* AMOS project](https://github.com/amosproj/amos2021ss01-emba-service) and [AMOS](https://github.com/amosproj).


Intel® Neural Compressor
===========================

 An open-source Python library supporting popular model compression techniques on all mainstream deep learning frameworks (TensorFlow, PyTorch, ONNX Runtime, and MXNet)

[![python](https://img.shields.io/badge/python-3.8%2B-blue)](https://github.com/intel/neural-compressor)
[![version](https://img.shields.io/badge/release-2.6-green)](https://github.com/intel/neural-compressor/releases)
[![license](https://img.shields.io/badge/license-Apache%202-blue)](https://github.com/intel/neural-compressor/blob/master/LICENSE)
[![coverage](https://img.shields.io/badge/coverage-85%25-green)](https://github.com/intel/neural-compressor)
[![Downloads](https://static.pepy.tech/personalized-badge/neural-compressor?period=total&units=international_system&left_color=grey&right_color=green&left_text=downloads)](https://pepy.tech/project/neural-compressor)

[Architecture](./docs/source/design.md#architecture)   |   [Workflow](./docs/source/design.md#workflow)   |   [LLMs Recipes](./docs/source/llm_recipes.md)   |   [Results](./docs/source/validated_model_list.md)   |   [Documentations](https://intel.github.io/neural-compressor)

---

Intel® Neural Compressor aims to provide popular model compression techniques such as quantization, pruning (sparsity), distillation, and neural architecture search on mainstream frameworks such as [TensorFlow](https://www.tensorflow.org/), [PyTorch](https://pytorch.org/), [ONNX Runtime](https://onnxruntime.ai/), and [MXNet](https://mxnet.apache.org/),
as well as Intel extensions such as [Intel Extension for TensorFlow](https://github.com/intel/intel-extension-for-tensorflow) and [Intel Extension for PyTorch](https://github.com/intel/intel-extension-for-pytorch).
In particular, the tool provides the key features, typical examples, and open collaborations as below:

* Support a wide range of Intel hardware such as [Intel Xeon Scalable Processors](https://www.intel.com/content/www/us/en/products/details/processors/xeon/scalable.html), [Intel Xeon CPU Max Series](https://www.intel.com/content/www/us/en/products/details/processors/xeon/max-series.html), [Intel Data Center GPU Flex Series](https://www.intel.com/content/www/us/en/products/details/discrete-gpus/data-center-gpu/flex-series.html), and [Intel Data Center GPU Max Series](https://www.intel.com/content/www/us/en/products/details/discrete-gpus/data-center-gpu/max-series.html) with extensive testing; support AMD CPU, ARM CPU, and NVidia GPU through ONNX Runtime with limited testing

* Validate popular LLMs such as [LLama2](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), [Falcon](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), [GPT-J](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), [Bloom](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), [OPT](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), and more than 10,000 broad models such as [Stable Diffusion](/examples/pytorch/nlp/huggingface_models/text-to-image/quantization), [BERT-Large](/examples/pytorch/nlp/huggingface_models/text-classification/quantization/ptq_static/fx), and [ResNet50](/examples/pytorch/image_recognition/torchvision_models/quantization/ptq/cpu/fx) from popular model hubs such as [Hugging Face](https://huggingface.co/), [Torch Vision](https://pytorch.org/vision/stable/index.html), and [ONNX Model Zoo](https://github.com/onnx/models#models), by leveraging zero-code optimization solution [Neural Coder](/neural_coder#what-do-we-offer) and automatic [accuracy-driven](/docs/source/design.md#workflow) quantization strategies

* Collaborate with cloud marketplaces such as [Google Cloud Platform](https://console.cloud.google.com/marketplace/product/bitnami-launchpad/inc-tensorflow-intel?project=verdant-sensor-286207), [Amazon Web Services](https://aws.amazon.com/marketplace/pp/prodview-yjyh2xmggbmga#pdp-support), and [Azure](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/bitnami.inc-tensorflow-intel), software platforms such as [Alibaba Cloud](https://www.intel.com/content/www/us/en/developer/articles/technical/quantize-ai-by-oneapi-analytics-on-alibaba-cloud.html), [Tencent TACO](https://new.qq.com/rain/a/20221202A00B9S00) and [Microsoft Olive](https://github.com/microsoft/Olive), and open AI ecosystem such as [Hugging Face](https://huggingface.co/blog/intel), [PyTorch](https://pytorch.org/tutorials/recipes/intel_neural_compressor_for_pytorch.html), [ONNX](https://github.com/onnx/models#models), [ONNX Runtime](https://github.com/microsoft/onnxruntime), and [Lightning AI](https://github.com/Lightning-AI/lightning/blob/master/docs/source-pytorch/advanced/post_training_quantization.rst)

## What's New
* [2024/03] A new SOTA approach [AutoRound](https://github.com/intel/auto-round) Weight-Only Quantization on [Intel Gaudi2 AI accelerator](https://habana.ai/products/gaudi2/) is available for LLMs.

## Installation

### Install from pypi
```Shell
pip install neural-compressor
```
> **Note**:
> Further installation methods can be found under [Installation Guide](https://github.com/intel/neural-compressor/blob/master/docs/source/installation_guide.md). check out our [FAQ](https://github.com/intel/neural-compressor/blob/master/docs/source/faq.md) for more details.

## Getting Started

Setting up the environment:
```bash
pip install "neural-compressor>=2.3" "transformers>=4.34.0" torch torchvision
```
After successfully installing these packages, try your first quantization program.

### Weight-Only Quantization (LLMs)
Following example code demonstrates Weight-Only Quantization on LLMs, it supports Intel CPU, Intel Gauid2 AI Accelerator, Nvidia GPU, best device will be selected automatically.

To try on Intel Gaudi2, docker image with Gaudi Software Stack is recommended, please refer to following script for environment setup. More details can be found in [Gaudi Guide](https://docs.habana.ai/en/latest/Installation_Guide/Bare_Metal_Fresh_OS.html#launch-docker-image-that-was-built).
```bash
docker run -it --runtime=habana -e HABANA_VISIBLE_DEVICES=all -e OMPI_MCA_btl_vader_single_copy_mechanism=none --cap-add=sys_nice --net=host --ipc=host vault.habana.ai/gaudi-docker/1.14.0/ubuntu22.04/habanalabs/pytorch-installer-2.1.1:latest

# Check the container ID
docker ps

# Login into container
docker exec -it <container_id> bash

# Install the optimum-habana
pip install --upgrade-strategy eager optimum[habana]

# Install INC/auto_round
pip install neural-compressor auto_round
```
Run the example:
```python
from transformers import AutoModel, AutoTokenizer

from neural_compressor.config import PostTrainingQuantConfig
from neural_compressor.quantization import fit
from neural_compressor.adaptor.torch_utils.auto_round import get_dataloader

model_name = "EleutherAI/gpt-neo-125m"
float_model = AutoModel.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
dataloader = get_dataloader(tokenizer, seqlen=2048)

woq_conf = PostTrainingQuantConfig(
    approach="weight_only",
    op_type_dict={
        ".*": {  # match all ops
            "weight": {
                "dtype": "int",
                "bits": 4,
                "algorithm": "AUTOROUND",
            },
        }
    },
)
quantized_model = fit(model=float_model, conf=woq_conf, calib_dataloader=dataloader)
```
**Note:**

To try INT4 model inference, please directly use [Intel Extension for Transformers](https://github.com/intel/intel-extension-for-transformers), which leverages Intel Neural Compressor for model quantization.

### Static Quantization (Non-LLMs)

```python
from torchvision import models

from neural_compressor.config import PostTrainingQuantConfig
from neural_compressor.data import DataLoader, Datasets
from neural_compressor.quantization import fit

float_model = models.resnet18()
dataset = Datasets("pytorch")["dummy"](shape=(1, 3, 224, 224))
calib_dataloader = DataLoader(framework="pytorch", dataset=dataset)
static_quant_conf = PostTrainingQuantConfig()
quantized_model = fit(model=float_model, conf=static_quant_conf, calib_dataloader=calib_dataloader)
```

## Documentation

    Overview

      Architecture
      Workflow
      APIs
      LLMs Recipes
      Examples

      Python-based APIs

        Quantization
        Advanced Mixed Precision
        Pruning (Sparsity)
        Distillation

        Orchestration
        Benchmarking
        Distributed Compression
        Model Export

      Neural Coder (Zero-code Optimization)

        Launcher
        JupyterLab Extension
        Visual Studio Code Extension
        Supported Matrix

        Advanced Topics

          Adaptor
          Strategy
          Distillation for Quantization
          SmoothQuant

          Weight-Only Quantization (INT8/INT4/FP4/NF4)
          FP8 Quantization
          Layer-Wise Quantization

        Innovations for Productivity

          Neural Insights
          Neural Solution

> **Note**:
> Further documentations can be found at [User Guide](https://github.com/intel/neural-compressor/blob/master/docs/source/user_guide.md).

## Selected Publications/Events
* Blog by Intel: [Neural Compressor: Boosting AI Model Efficiency](https://community.intel.com/t5/Blogs/Tech-Innovation/Artificial-Intelligence-AI/Neural-Compressor-Boosting-AI-Model-Efficiency/post/1604740) (June 2024)
* Blog by Intel: [Optimization of Intel AI Solutions for Alibaba Cloud’s Qwen2 Large Language Models](https://www.intel.com/content/www/us/en/developer/articles/technical/intel-ai-solutions-accelerate-alibaba-qwen2-llms.html) (June 2024)
* Blog by Intel: [Accelerate Meta* Llama 3 with Intel AI Solutions](https://www.intel.com/content/www/us/en/developer/articles/technical/accelerate-meta-llama3-with-intel-ai-solutions.html) (Apr 2024)
* EMNLP'2023 (Under Review): [TEQ: Trainable Equivalent Transformation for Quantization of LLMs](https://openreview.net/forum?id=iaI8xEINAf&referrer=%5BAuthor%20Console%5D) (Sep 2023)
* arXiv: [Efficient Post-training Quantization with FP8 Formats](https://arxiv.org/abs/2309.14592) (Sep 2023)
* arXiv: [Optimize Weight Rounding via Signed Gradient Descent for the Quantization of LLMs](https://arxiv.org/abs/2309.05516) (Sep 2023)

> **Note**:
> View [Full Publication List](https://github.com/intel/neural-compressor/blob/master/docs/source/publication_list.md).

## Additional Content

* [Release Information](./docs/source/releases_info.md)
* [Contribution Guidelines](./docs/source/CONTRIBUTING.md)
* [Legal Information](./docs/source/legal_information.md)
* [Security Policy](SECURITY.md)

## Communication
- [GitHub Issues](https://github.com/intel/neural-compressor/issues): mainly for bug reports, new feature requests, question asking, etc.
- [Email](mailto:inc.maintainers@intel.com): welcome to raise any interesting research ideas on model compression techniques by email for collaborations.
- [Discord Channel](https://discord.com/invite/Wxk3J3ZJkU): join the discord channel for more flexible technical discussion.
- [WeChat group](/docs/source/imgs/wechat_group.jpg): scan the QA code to join the technical discussion.


<!--- the "--8<--" html comments define what part of the README to add to the index page of the documentation -->
<!--- --8<-- [start:docs] -->

![PAM](resources/logos/title.png)

# Population Activity Modeller

![DailyCIbadge](https://github.com/arup-group/pam/actions/workflows/daily-scheduled-ci.yml/badge.svg)
[![Documentation](https://github.com/arup-group/pam/actions/workflows/pages/pages-build-deployment/badge.svg?branch=gh-pages)](https://arup-group.github.io/pam)
[![image](https://img.shields.io/badge/Medium-12100E?style=for-the-badge&logo=medium&logoColor=white)](https://medium.com/arupcitymodelling/pandemic-activity-modifier-intro-3d2dccbc716e)
[![JOSS DOI](https://img.shields.io/badge/JOSS-10.21105/joss.06097-green.svg)](https://doi.org/10.21105/joss.06097)
[![Test coverage](https://codecov.io/gh/arup-group/pam/branch/main/graph/badge.svg?token=21BGH9M3FZ)](https://codecov.io/gh/arup-group/pam)
[![PyPI version](https://img.shields.io/pypi/v/cml-pam.svg)](https://pypi.python.org/pypi/cml-pam)
[![Anaconda.org version](https://img.shields.io/conda/vn/city-modelling-lab/cml-pam.svg?label=conda)](https://anaconda.org/city-modelling-lab/cml-pam)

PAM is a python library for population **activity sequence** modelling. Example use cases:

- **Read** an existing population then **write** to a new format.
- **Modify** an existing population, for example to model activity locations.
- **Create** your own activity-based model.

PAM supports common travel and activity formats, including MATSim.

## Activity Sequences?

Population **activity sequences** (sometimes called **activity plans**) are used to model the activities (where and when people are at home, work, education and so on) and associated travel of a population:

 ![PAM](resources/example-activity-plans.png)

Activity sequences are used by transport planners to model travel demand, but can also be used in other domains, such as for virus transmission or energy use modelling.

## Brief History

PAM was originally built and shared to rapidly modify existing activity models to respond to pandemic lock-down scenarios.

 ![PAM](resources/PAM-motivation.png)

This functionality used a **read-modify-write** pattern. Where modifications are made by applying **policies**. Example policies might be (a) infected persons quarantine at home, (b) only critical workers travel to work, and (c) everyone shops locally.

![PAM](resources/PAM-features.png)

## Features

### Activity Modelling

In addition to the original **read-modify-write** pattern and functionality, PAM has modules for:

- location modelling
- discretionary activity modelling
- mode choice modelling
- facility sampling
- vehicle ownership

More generally the core PAM data structure and modules can be used as a library to support your own use cases, including building your own activity-based model.

### MATSim

PAM fully supports the [MATSim](https://www.matsim.org/) population/plans format. This includes vehicles, unselected plans, leg routes and leg attributes. A core use case of PAM is to ***read-modify-write*** *experienced plans* from MATSim. This can allow new MATSim scenarios to be *"warm started"* from existing scenarios, significantly reducing MATSim compute time.

<!--- --8<-- [end:docs] -->
## Documentation

For more detailed instructions, see our [documentation](https://arup-group.github.io/pam/latest).

## Installation

To install PAM, we recommend using the [mamba](https://mamba.readthedocs.io/en/latest/index.html) package manager:

### As a user
<!--- --8<-- [start:docs-install-user] -->
``` shell
mamba create -n pam -c conda-forge -c city-modelling-lab cml-pam
mamba activate pam
```
<!--- --8<-- [end:docs-install-user] -->
### As a developer
<!--- --8<-- [start:docs-install-dev] -->
``` shell
git clone git@github.com:arup-group/pam.git
cd pam
mamba create -n pam -c conda-forge -c city-modelling-lab --file requirements/base.txt --file requirements/dev.txt
mamba activate pam
pip install --no-deps -e .
```
<!--- --8<-- [end:docs-install-dev] -->

### Installing with pip

Installing directly with pip as a user (`pip install cml-pam`) or as a developer (`pip install -e '.[dev]'`) is also possible, but you will need the `libgdal` & `libspatialindex` geospatial non-python libraries pre-installed.

For more detailed instructions, see our [documentation](https://arup-group.github.io/pam/latest/installation/).

## Contributing

There are many ways to make both technical and non-technical contributions to PAM.
Before making contributions to the PAM source code, see our contribution guidelines and follow the [development install instructions](#as-a-developer).

If you are using `pip` to install PAM instead of the recommended `mamba`, you can install the optional test and documentation libraries using the `dev` option, i.e., `pip install -e '.[dev]'`

If you plan to make changes to the code then please make regular use of the following tools to verify the codebase while you work:

- `pre-commit`: run `pre-commit install` in your command line to load inbuilt checks that will run every time you commit your changes.
The checks are: 1. check no large files have been staged, 2. lint python files for major errors, 3. format python files to conform with the [pep8 standard](https://peps.python.org/pep-0008/).
You can also run these checks yourself at any time to ensure staged changes are clean by simple calling `pre-commit`.
- `pytest` - run the unit test suite, check test coverage, and test that the example notebooks successfully run.
- `pytest -p memray -m "high_mem" --no-cov` (not available on Windows) - after installing memray (`mamba install memray pytest-memray`), test that memory and time performance does not exceed benchmarks.

For more information, see our [documentation](https://arup-group.github.io/pam/latest/contributing/coding/).

## Building the documentation

If you are unable to access the online documentation, you can build the documentation locally.
First, [install a development environment of PAM](https://arup-group.github.io/pam/latest/contributing/coding/), then deploy the documentation using [mike](https://github.com/jimporter/mike):

```
mike deploy 0.2
mike serve
```

Then you can view the documentation in a browser at <http://localhost:8000/>.

## Credits

This package was created with [Cookiecutter](https://github.com/audreyr/cookiecutter) and the [arup-group/cookiecutter-pypackage](https://github.com/arup-group/cookiecutter-pypackage) project template.


Pycord
======

.. image:: https://img.shields.io/discord/881207955029110855?label=discord&style=for-the-badge&logo=discord&color=5865F2&logoColor=white
   :target: https://pycord.dev/discord
   :alt: Discord server invite
.. image:: https://img.shields.io/pypi/v/py-cord.svg?style=for-the-badge&logo=pypi&color=yellowgreen&logoColor=white
   :target: https://pypi.python.org/pypi/py-cord
   :alt: PyPI version info
.. image:: https://img.shields.io/pypi/pyversions/py-cord.svg?style=for-the-badge&logo=python&logoColor=white
   :target: https://pypi.python.org/pypi/py-cord
   :alt: PyPI supported Python versions
.. image:: https://img.shields.io/pypi/dm/py-cord?color=blueviolet&logo=pypi&logoColor=white&style=for-the-badge
   :target: https://pypi.python.org/pypi/py-cord
   :alt: PyPI downloads
.. image:: https://img.shields.io/github/v/release/Pycord-Development/pycord?include_prereleases&label=Latest%20Release&logo=github&sort=semver&style=for-the-badge&logoColor=white
   :target: https://github.com/Pycord-Development/pycord/releases
   :alt: Latest release

A fork of discord.py. Pycord is a modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python.

Key Features
------------

- Modern Pythonic API using ``async`` and ``await``.
- Proper rate limit handling.
- Optimised for both speed and memory usage.
- Full Application Command Support

Installing
----------

**Python 3.8 or higher is required**

To install the library without full voice support, run the following command:

.. code:: sh

    # Linux/macOS
    python3 -m pip install -U py-cord

    # Windows
    py -3 -m pip install -U py-cord

Otherwise, to get full voice support, run the following command:

.. code:: sh

    # Linux/macOS
    python3 -m pip install -U "py-cord[voice]"

    # Windows
    py -3 -m pip install -U py-cord[voice]

To install additional packages for speedup, run the following command:

.. code:: sh

    # Linux/macOS
    python3 -m pip install -U "py-cord[speed]"
    # Windows
    py -3 -m pip install -U py-cord[speed]

To install the development version, do the following:

.. code:: sh

    $ git clone https://github.com/Pycord-Development/pycord
    $ cd pycord
    $ python3 -m pip install -U .[voice]

or if you do not want to clone the repository:

.. code:: sh

    # Linux/macOS
    python3 -m pip install git+https://github.com/Pycord-Development/pycord
    # Windows
    py -3 -m pip install git+https://github.com/Pycord-Development/pycord

Optional Packages
~~~~~~~~~~~~~~~~~

* `PyNaCl <https://pypi.org/project/PyNaCl/>`__ (for voice support)
* `aiodns <https://pypi.org/project/aiodns/>`__, `brotlipy <https://pypi.org/project/brotlipy/>`__, `cchardet <https://pypi.org/project/cchardet/>`__ (for aiohttp speedup)
* `msgspec <https://pypi.org/project/msgspec/>`__ (for json speedup)

Please note that while installing voice support on Linux, you must install the following packages via your preferred package manager (e.g. ``apt``, ``dnf``, etc) BEFORE running the above commands:

* libffi-dev (or ``libffi-devel`` on some systems)
* python-dev (e.g. ``python3.10-dev`` for Python 3.10)

Quick Example
-------------

.. code:: py

    import discord

    bot = discord.Bot()

    @bot.slash_command()
    async def hello(ctx, name: str = None):
        name = name or ctx.author.name
        await ctx.respond(f"Hello {name}!")

    @bot.user_command(name="Say Hello")
    async def hi(ctx, user):
        await ctx.respond(f"{ctx.author.mention} says hello to {user.name}!")

    bot.run("token")

Traditional Commands Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code:: py

    import discord
    from discord.ext import commands

    intents = discord.Intents.default()
    intents.message_content = True
    bot = commands.Bot(command_prefix=">", intents=intents)

    @bot.command()
    async def ping(ctx):
        await ctx.send("pong")

    bot.run("token")

You can find more code examples in the ``examples`` directory.

Note: Make sure you do not reveal your bot token to anyone, as it can grant access to your bot.

Useful Links
------------

- `Documentation <https://docs.pycord.dev/en/master/index.html>`_
- `Learn how to create Discord bots with Pycord <https://guide.pycord.dev>`_
- `Our Official Discord Server <https://pycord.dev/discord>`_
- `Official Discord Developers Server <https://discord.gg/discord-developers>`_


# gcpdiag - Diagnostics for Google Cloud Platform

[![code analysis badge](https://github.com/GoogleCloudPlatform/gcpdiag/actions/workflows/code-analysis.yml/badge.svg?branch=main&event=push)](https://github.com/GoogleCloudPlatform/gcpdiag/actions/workflows/code-analysis.yml?query=branch%3Amain+event%3Apush)
[![test badge](https://github.com/GoogleCloudPlatform/gcpdiag/actions/workflows/test.yml/badge.svg?branch=main&event=push)](https://github.com/GoogleCloudPlatform/gcpdiag/actions/workflows/test.yml?query=branch%3Amain+event%3Apush)

**gcpdiag** is a command-line diagnostics tool for GCP customers. It finds
and helps to fix common issues in Google Cloud Platform projects. It is used to
test projects against a wide range of best practices and frequent mistakes,
based on the troubleshooting experience of the Google Cloud Support team.

gcpdiag is open-source and contributions are welcome! Note that this is not
an officially supported Google product, but a community effort. The Google Cloud
Support team maintains this code and we do our best to avoid causing any
problems in your projects, but we give no guarantees to that end.

## Installation

You can run gcpdiag using a shell wrapper that starts gcpdiag in a Docker
container. This should work on any machine with Docker or Podman installed,
including Cloud Shell.

```
curl https://gcpdiag.dev/gcpdiag.sh >gcpdiag
chmod +x gcpdiag
./gcpdiag lint --project=MYPROJECT
```

## Usage

Currently gcpdiag mainly supports one subcommand: `lint`, which is used
to run diagnostics on one or more GCP projects.

```
usage:

gcpdiag lint --project P [OPTIONS]
gcpdiag lint --project P [--name faulty-vm --location us-central1-a --label key:value]

Run diagnostics in GCP projects.

optional arguments:
  -h, --help            show this help message and exit
  --auth-adc            Authenticate using Application Default Credentials (default)
  --auth-key FILE       Authenticate using a service account private key file
  --project P           Project ID of project to inspect
  --name n [n ...]      Resource Name(s) to inspect (e.g.: bastion-host,prod-*)
  --location R [R ...]  Valid GCP region/zone to scope inspection (e.g.: us-central1-a,us-central1)
  --label key:value     One or more resource labels as key-value pair(s) to scope inspection
                        (e.g.:  env:prod, type:frontend or env=prod type=frontend)
  --billing-project P   Project used for billing/quota of API calls done by gcpdiag (default is the inspected project, requires
                        'serviceusage.services.use' permission)
  --show-skipped        Show skipped rules
  --hide-ok             Hide rules with result OK
  --enable-gce-serial-buffer
                        Fetch serial port one output directly from the Compute API. Use this flag when not exporting
                        serial port output to cloud logging.
  --include INCLUDE     Include rule pattern (e.g.: `gke`, `gke/*/2021*`). Multiple pattern can be specified (comma separated, or with multiple
                        arguments)
  --exclude EXCLUDE     Exclude rule pattern (e.g.: `BP`, `*/*/2022*`)
  --include-extended    Include extended rules. Additional rules might generate false positives (default: False)
  -v, --verbose         Increase log verbosity
  --within-days D       How far back to search logs and metrics (default: 3 days)
  --config FILE         Read configuration from FILE
  --logging-ratelimit-requests R
                        Configure rate limit for logging queries (default: 60)
  --logging-ratelimit-period-seconds S
                        Configure rate limit period for logging queries (default: 60 seconds)
  --logging-page-size P
                        Configure page size for logging queries (default: 500)
  --logging-fetch-max-entries E
                        Configure max entries to fetch by logging queries (default: 10000)
  --logging-fetch-max-time-seconds S
                        Configure timeout for logging queries (default: 120 seconds)
  --output FORMATTER    Format output as one of [terminal, json, csv] (default: terminal)
```

### Authentication

gcpdiag supports authentication using multiple mechanisms:

1. Application default credentials

   gcpdiag can use Cloud SDK's [Application Default
   Credentials](https://google-auth.readthedocs.io/en/latest/reference/google.auth.html#google.auth.default).
   This might require that you first run `gcloud auth login --update-adc` to
   update the cached credentials. This is the default in Cloud Shell because in
   that environment, ADC credentials are automatically provisioned.

1. Service account key

   You can also use the `--auth-key` parameter to specify the [private
   key](https://cloud.google.com/iam/docs/creating-managing-service-account-keys)
   of a service account.

The authenticated principal will need as minimum the following roles granted (both of them):

- `Viewer` on the inspected project
- `Service Usage Consumer` on the project used for billing/quota enforcement,
  which is per default the project being inspected, but can be explicitly set
  using the `--billing-project` option

The Editor and Owner roles include all the required permissions, but if you use
service account authentication (`--auth-key`), we recommend to only grant the
Viewer+Service Usage Consumer on that service account.

### Test Products, Classes, and IDs

Tests are organized by product, class, and ID.

The **product** is the GCP service that is being tested. Examples: GKE or GCE.

The **class** is what kind of test it is, currently we have:

| Class name | Description                                     |
| ---------- | ----------------------------------------------- |
| BP         | Best practice, opinionated recommendations      |
| WARN       | Warnings: things that are possibly wrong        |
| ERR        | Errors: things that are very likely to be wrong |
| SEC        | Potential security issues                       |

The **ID** is currently formatted as YYYY_NNN, where YYYY is the year the test
was written, and NNN is a counter. The ID must be unique per product/class
combination.

Each test also has a **short_description** and a **long_description**. The short
description is a statement about the **good state** that is being verified to be
true (i.e. we don't test for errors, we test for compliance, i.e. an problem not
to be present).

## Further Information

See http://gcpdiag.dev for more information:

- Documentation
- Lint rule descriptions
- Development guides


![capa](https://github.com/mandiant/capa/blob/master/.github/logo.png)

[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/flare-capa)](https://pypi.org/project/flare-capa)
[![Last release](https://img.shields.io/github/v/release/mandiant/capa)](https://github.com/mandiant/capa/releases)
[![Number of rules](https://gist.githubusercontent.com/capa-bot/6d7960e911f48b3b74916df8988cf0f3/raw/rules_badge.svg)](https://github.com/mandiant/capa-rules)
[![CI status](https://github.com/mandiant/capa/workflows/CI/badge.svg)](https://github.com/mandiant/capa/actions?query=workflow%3ACI+event%3Apush+branch%3Amaster)
[![Downloads](https://img.shields.io/github/downloads/mandiant/capa/total)](https://github.com/mandiant/capa/releases)
[![License](https://img.shields.io/badge/license-Apache--2.0-green.svg)](LICENSE.txt)

capa detects capabilities in executable files.
You run it against a PE, ELF, .NET module, shellcode file, or a sandbox report and it tells you what it thinks the program can do.
For example, it might suggest that the file is a backdoor, is capable of installing services, or relies on HTTP to communicate.

Check out our capa blog posts:
- [Dynamic capa: Exploring Executable Run-Time Behavior with the CAPE Sandbox](https://www.mandiant.com/resources/blog/dynamic-capa-executable-behavior-cape-sandbox)
- [capa v4: casting a wider .NET](https://www.mandiant.com/resources/blog/capa-v4-casting-wider-net) (.NET support)
- [ELFant in the Room – capa v3](https://www.mandiant.com/resources/elfant-in-the-room-capa-v3) (ELF support)
- [capa 2.0: Better, Stronger, Faster](https://www.mandiant.com/resources/capa-2-better-stronger-faster)
- [capa: Automatically Identify Malware Capabilities](https://www.mandiant.com/resources/capa-automatically-identify-malware-capabilities)

```
$ capa.exe suspicious.exe

+------------------------+--------------------------------------------------------------------------------+
| ATT&CK Tactic          | ATT&CK Technique                                                               |
|------------------------+--------------------------------------------------------------------------------|
| DEFENSE EVASION        | Obfuscated Files or Information [T1027]                                        |
| DISCOVERY              | Query Registry [T1012]                                                         |
|                        | System Information Discovery [T1082]                                           |
| EXECUTION              | Command and Scripting Interpreter::Windows Command Shell [T1059.003]           |
|                        | Shared Modules [T1129]                                                         |
| EXFILTRATION           | Exfiltration Over C2 Channel [T1041]                                           |
| PERSISTENCE            | Create or Modify System Process::Windows Service [T1543.003]                   |
+------------------------+--------------------------------------------------------------------------------+

+-------------------------------------------------------+-------------------------------------------------+
| CAPABILITY                                            | NAMESPACE                                       |
|-------------------------------------------------------+-------------------------------------------------|
| check for OutputDebugString error                     | anti-analysis/anti-debugging/debugger-detection |
| read and send data from client to server              | c2/file-transfer                                |
| execute shell command and capture output              | c2/shell                                        |
| receive data (2 matches)                              | communication                                   |
| send data (6 matches)                                 | communication                                   |
| connect to HTTP server (3 matches)                    | communication/http/client                       |
| send HTTP request (3 matches)                         | communication/http/client                       |
| create pipe                                           | communication/named-pipe/create                 |
| get socket status (2 matches)                         | communication/socket                            |
| receive data on socket (2 matches)                    | communication/socket/receive                    |
| send data on socket (3 matches)                       | communication/socket/send                       |
| connect TCP socket                                    | communication/socket/tcp                        |
| encode data using Base64                              | data-manipulation/encoding/base64               |
| encode data using XOR (6 matches)                     | data-manipulation/encoding/xor                  |
| run as a service                                      | executable/pe                                   |
| get common file path (3 matches)                      | host-interaction/file-system                    |
| read file                                             | host-interaction/file-system/read               |
| write file (2 matches)                                | host-interaction/file-system/write              |
| print debug messages (2 matches)                      | host-interaction/log/debug/write-event          |
| resolve DNS                                           | host-interaction/network/dns/resolve            |
| get hostname                                          | host-interaction/os/hostname                    |
| create a process with modified I/O handles and window | host-interaction/process/create                 |
| create process                                        | host-interaction/process/create                 |
| create registry key                                   | host-interaction/registry/create                |
| create service                                        | host-interaction/service/create                 |
| create thread                                         | host-interaction/thread/create                  |
| persist via Windows service                           | persistence/service                             |
+-------------------------------------------------------+-------------------------------------------------+
```

# download and usage

Download stable releases of the standalone capa binaries [here](https://github.com/mandiant/capa/releases). You can run the standalone binaries without installation. capa is a command line tool that should be run from the terminal.

To use capa as a library or integrate with another tool, see [doc/installation.md](https://github.com/mandiant/capa/blob/master/doc/installation.md) for further setup instructions.

For more information about how to use capa, see [doc/usage.md](https://github.com/mandiant/capa/blob/master/doc/usage.md).

# example

In the above sample output, we ran capa against an unknown binary (`suspicious.exe`),
and the tool reported that the program can send HTTP requests, decode data via XOR and Base64,
install services, and spawn new processes.
Taken together, this makes us think that `suspicious.exe` could be a persistent backdoor.
Therefore, our next analysis step might be to run `suspicious.exe` in a sandbox and try to recover the command and control server.

By passing the `-vv` flag (for very verbose), capa reports exactly where it found evidence of these capabilities.
This is useful for at least two reasons:

  - it helps explain why we should trust the results, and enables us to verify the conclusions, and
  - it shows where within the binary an experienced analyst might study with IDA Pro

```
$ capa.exe suspicious.exe -vv
...
execute shell command and capture output
namespace   c2/shell
author      matthew.williams@mandiant.com
scope       function
att&ck      Execution::Command and Scripting Interpreter::Windows Command Shell [T1059.003]
references  https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-startupinfoa
function @ 0x4011C0
  and:
    match: create a process with modified I/O handles and window @ 0x4011C0
      and:
        number: 257 = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW @ 0x4012B8
        or:
          number: 68 = StartupInfo.cb (size) @ 0x401282
        or: = API functions that accept a pointer to a STARTUPINFO structure
          api: kernel32.CreateProcess @ 0x401343
    match: create pipe @ 0x4011C0
      or:
        api: kernel32.CreatePipe @ 0x40126F, 0x401280
    optional:
      match: create thread @ 0x40136A, 0x4013BA
        or:
          and:
            os: windows
            or:
              api: kernel32.CreateThread @ 0x4013D7
        or:
          and:
            os: windows
            or:
              api: kernel32.CreateThread @ 0x401395
    or:
      string: "cmd.exe" @ 0x4012FD
...
```

Additionally, capa also supports analyzing [CAPE](https://github.com/kevoreilly/CAPEv2) sandbox reports for dynamic capability extraction.
In order to use this, you first submit your sample to CAPE for analysis, and then run capa against the generated report (JSON).

Here's an example of running capa against a packed binary, and then running capa against the CAPE report of that binary:

```yaml
$ capa 05be49819139a3fdcdbddbdefd298398779521f3d68daa25275cc77508e42310.exe
WARNING:capa.capabilities.common:--------------------------------------------------------------------------------
WARNING:capa.capabilities.common: This sample appears to be packed.
WARNING:capa.capabilities.common:
WARNING:capa.capabilities.common: Packed samples have often been obfuscated to hide their logic.
WARNING:capa.capabilities.common: capa cannot handle obfuscation well using static analysis. This means the results may be misleading or incomplete.
WARNING:capa.capabilities.common: If possible, you should try to unpack this input file before analyzing it with capa.
WARNING:capa.capabilities.common: Alternatively, run the sample in a supported sandbox and invoke capa against the report to obtain dynamic analysis results.
WARNING:capa.capabilities.common:
WARNING:capa.capabilities.common: Identified via rule: (internal) packer file limitation
WARNING:capa.capabilities.common:
WARNING:capa.capabilities.common: Use -v or -vv if you really want to see the capabilities identified by capa.
WARNING:capa.capabilities.common:--------------------------------------------------------------------------------

$ capa 05be49819139a3fdcdbddbdefd298398779521f3d68daa25275cc77508e42310.json

┍━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑
│ ATT&CK Tactic          │ ATT&CK Technique                                                                   │
┝━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥
│ CREDENTIAL ACCESS      │ Credentials from Password Stores T1555                                             │
├────────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ DEFENSE EVASION        │ File and Directory Permissions Modification T1222                                  │
│                        │ Modify Registry T1112                                                              │
│                        │ Obfuscated Files or Information T1027                                              │
│                        │ Virtualization/Sandbox Evasion::User Activity Based Checks T1497.002               │
├────────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ DISCOVERY              │ Account Discovery T1087                                                            │
│                        │ Application Window Discovery T1010                                                 │
│                        │ File and Directory Discovery T1083                                                 │
│                        │ Query Registry T1012                                                               │
│                        │ System Information Discovery T1082                                                 │
│                        │ System Location Discovery::System Language Discovery T1614.001                     │
│                        │ System Owner/User Discovery T1033                                                  │
├────────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ EXECUTION              │ System Services::Service Execution T1569.002                                       │
├────────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ PERSISTENCE            │ Boot or Logon Autostart Execution::Registry Run Keys / Startup Folder T1547.001    │
│                        │ Boot or Logon Autostart Execution::Winlogon Helper DLL T1547.004                   │
│                        │ Create or Modify System Process::Windows Service T1543.003                         │
┕━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙

┍━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑
│ Capability                                           │ Namespace                                            │
┝━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥
│ check for unmoving mouse cursor (3 matches)          │ anti-analysis/anti-vm/vm-detection                   │
│ gather bitkinex information                          │ collection/file-managers                             │
│ gather classicftp information                        │ collection/file-managers                             │
│ gather filezilla information                         │ collection/file-managers                             │
│ gather total-commander information                   │ collection/file-managers                             │
│ gather ultrafxp information                          │ collection/file-managers                             │
│ resolve DNS (23 matches)                             │ communication/dns                                    │
│ initialize Winsock library (7 matches)               │ communication/socket                                 │
│ act as TCP client (3 matches)                        │ communication/tcp/client                             │
│ create new key via CryptAcquireContext               │ data-manipulation/encryption                         │
│ encrypt or decrypt via WinCrypt                      │ data-manipulation/encryption                         │
│ hash data via WinCrypt                               │ data-manipulation/hashing                            │
│ initialize hashing via WinCrypt                      │ data-manipulation/hashing                            │
│ hash data with MD5                                   │ data-manipulation/hashing/md5                        │
│ generate random numbers via WinAPI                   │ data-manipulation/prng                               │
│ extract resource via kernel32 functions (2 matches)  │ executable/resource                                  │
│ interact with driver via control codes (2 matches)   │ host-interaction/driver                              │
│ get Program Files directory (18 matches)             │ host-interaction/file-system                         │
│ get common file path (575 matches)                   │ host-interaction/file-system                         │
│ create directory (2 matches)                         │ host-interaction/file-system/create                  │
│ delete file                                          │ host-interaction/file-system/delete                  │
│ get file attributes (122 matches)                    │ host-interaction/file-system/meta                    │
│ set file attributes (8 matches)                      │ host-interaction/file-system/meta                    │
│ move file                                            │ host-interaction/file-system/move                    │
│ find taskbar (3 matches)                             │ host-interaction/gui/taskbar/find                    │
│ get keyboard layout (12 matches)                     │ host-interaction/hardware/keyboard                   │
│ get disk size                                        │ host-interaction/hardware/storage                    │
│ get hostname (4 matches)                             │ host-interaction/os/hostname                         │
│ allocate or change RWX memory (3 matches)            │ host-interaction/process/inject                      │
│ query or enumerate registry key (3 matches)          │ host-interaction/registry                            │
│ query or enumerate registry value (8 matches)        │ host-interaction/registry                            │
│ delete registry key                                  │ host-interaction/registry/delete                     │
│ start service                                        │ host-interaction/service/start                       │
│ get session user name                                │ host-interaction/session                             │
│ persist via Run registry key                         │ persistence/registry/run                             │
│ persist via Winlogon Helper DLL registry key         │ persistence/registry/winlogon-helper                 │
│ persist via Windows service (2 matches)              │ persistence/service                                  │
┕━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙
```

capa uses a collection of rules to identify capabilities within a program.
These rules are easy to write, even for those new to reverse engineering.
By authoring rules, you can extend the capabilities that capa recognizes.
In some regards, capa rules are a mixture of the OpenIOC, Yara, and YAML formats.

Here's an example rule used by capa:

```yaml
rule:
  meta:
    name: create TCP socket
    namespace: communication/socket/tcp
    authors:
      - william.ballenthin@mandiant.com
      - joakim@intezer.com
      - anushka.virgaonkar@mandiant.com
    scopes:
      static: basic block
      dynamic: call
    mbc:
      - Communication::Socket Communication::Create TCP Socket [C0001.011]
    examples:
      - Practical Malware Analysis Lab 01-01.dll_:0x10001010
  features:
    - or:
      - and:
        - number: 6 = IPPROTO_TCP
        - number: 1 = SOCK_STREAM
        - number: 2 = AF_INET
        - or:
          - api: ws2_32.socket
          - api: ws2_32.WSASocket
          - api: socket
      - property/read: System.Net.Sockets.TcpClient::Client
```

The [github.com/mandiant/capa-rules](https://github.com/mandiant/capa-rules) repository contains hundreds of standard library rules that are distributed with capa.
Please learn to write rules and contribute new entries as you find interesting techniques in malware.

If you use IDA Pro, then you can use the [capa explorer](https://github.com/mandiant/capa/tree/master/capa/ida/plugin) plugin.
capa explorer helps you identify interesting areas of a program and build new capa rules using features extracted directly from your IDA Pro database.

![capa + IDA Pro integration](https://github.com/mandiant/capa/blob/master/doc/img/explorer_expanded.png)

If you use Ghidra, then you can use the [capa + Ghidra integration](/capa/ghidra/) to run capa's analysis directly on your Ghidra database and render the results in Ghidra's user interface.

<img src="https://github.com/mandiant/capa/assets/66766340/eeae33f4-99d4-42dc-a5e8-4c1b8c661492" width=300>

# further information
## capa
- [Installation](https://github.com/mandiant/capa/blob/master/doc/installation.md)
- [Usage](https://github.com/mandiant/capa/blob/master/doc/usage.md)
- [Limitations](https://github.com/mandiant/capa/blob/master/doc/limitations.md)
- [Contributing Guide](https://github.com/mandiant/capa/blob/master/.github/CONTRIBUTING.md)

## capa rules
- [capa-rules repository](https://github.com/mandiant/capa-rules)
- [capa-rules rule format](https://github.com/mandiant/capa-rules/blob/master/doc/format.md)

## capa testfiles
The [capa-testfiles repository](https://github.com/mandiant/capa-testfiles) contains the data we use to test capa's code and rules


#

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

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

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

## 目次
- [設計思想](#設計思想)
- [動作環境](#動作環境)
  - [サーバー](#サーバー)
  - [クライアント](#クライアント)
- [備考・注意事項](#備考注意事項)
- [事前準備](#事前準備)
  - [チューナーのドライバーを px4\_drv に変更する](#チューナーのドライバーを-px4_drv-に変更する)
  - [EDCB の事前設定](#edcb-の事前設定)
  - [QSVEncC・NVEncC・VCEEncC・rkmppenc に対応した GPU ドライバーのインストール](#qsvenccnvenccvceenccrkmppenc-に対応した-gpu-ドライバーのインストール)
    - [Windows](#windows)
    - [Linux](#linux)
  - [Tailscale の導入](#tailscale-の導入)
- [サーバーのインストール/アップデート](#サーバーのインストールアップデート)
  - [Windows](#windows-1)
  - [Linux](#linux-1)
  - [KonomiTV にアクセスする](#konomitv-にアクセスする)
  - [デスクトップアプリ・スマホアプリとして使う](#デスクトップアプリスマホアプリとして使う)
  - [フィードバックのお願い](#フィードバックのお願い)
- [付録](#付録)
  - [`https://aa-bb-cc-dd.local.konomi.tv:7000/` の URL について](#httpsaa-bb-cc-ddlocalkonomitv7000-の-url-について)
  - [設定ファイルの編集](#設定ファイルの編集)
    - [バックエンドの設定](#バックエンドの設定)
    - [エンコーダーの設定](#エンコーダーの設定)
    - [リッスンポートの設定](#リッスンポートの設定)
    - [アップロードしたキャプチャ画像の保存先フォルダの設定](#アップロードしたキャプチャ画像の保存先フォルダの設定)
  - [局ロゴ](#局ロゴ)
- [FAQ](#faq)
  - [Web UI にアクセスすると 502 Bad Gateway エラーが表示される](#web-ui-にアクセスすると-502-bad-gateway-エラーが表示される)
  - [Web UI にアクセスすると「Client sent an HTTP request to an HTTPS server.」と表示される](#web-ui-にアクセスするとclient-sent-an-http-request-to-an-https-serverと表示される)
  - [Web UI にアクセスすると「このサイトは安全に接続できません」「～から無効な応答が送信されました。」(ERR\_SSL\_PROTOCOL\_ERROR) と表示される](#web-ui-にアクセスするとこのサイトは安全に接続できませんから無効な応答が送信されましたerr_ssl_protocol_error-と表示される)
  - [Web UI にアクセスすると、DNS エラーが表示される](#web-ui-にアクセスするとdns-エラーが表示される)
  - [ライブストリーミングの視聴が安定しない・途切れ途切れになる](#ライブストリーミングの視聴が安定しない途切れ途切れになる)
    - [全般](#全般)
    - [KonomiTV サーバーのある自宅の Wi-Fi につないで視聴しているとき](#konomitv-サーバーのある自宅の-wi-fi-につないで視聴しているとき)
    - [外出先 (自宅以外) から Tailscale 経由で視聴しているとき](#外出先-自宅以外-から-tailscale-経由で視聴しているとき)
- [開発者向け情報](#開発者向け情報)
  - [開発版 KonomiTV のインストール (開発環境の構築)](#開発版-konomitv-のインストール-開発環境の構築)
  - [サーバーの起動](#サーバーの起動)
  - [Windows / PM2 サービスのインストールと起動](#windows--pm2-サービスのインストールと起動)
    - [Windows サービス](#windows-サービス)
    - [PM2 サービス](#pm2-サービス)
  - [クライアントの開発・ビルド](#クライアントの開発ビルド)
- [寄付・支援について](#寄付支援について)
- [Special Thanks](#special-thanks)
- [License](#license)

## 設計思想

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

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

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

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

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

## 動作環境

### サーバー

- **Windows 10/11 PC または Linux (Ubuntu) PC**
  - **Windows 10 Pro と Ubuntu 20.04 LTS の PC でのみ動作確認を行っています。**
    - Windows 11 でも動作するとは思いますが、手元に環境がないため、検証は行っていません。
    - 32bit 版の Windows 10 には対応していません。
  - **Linux PC は Ubuntu (20.04 LTS 以降) / Debian (11 Bullseye 以降) のみサポートしています。**
    - Linux PC では、Docker で動かすこともできます（後述）。
    - Debian での動作確認はしていません。おそらく動くとは思いますが…
    - RedHat 系 OS・Arch Linux でも動作するかもしれませんが、開発/検証リソースが大幅に不足しているため、サポートは行いません。
      - できるだけ Ubuntu の利用を推奨しますが、もし Ubuntu 以外の OS にインストールする際は、Docker でのインストールを推奨します。
      - ビルド済みのサードパーティーライブラリは glibc 2.31 以上に依存しています。Docker を使わずにインストールする場合、[glibc 2.30 以下を採用する OS](https://repology.org/project/glibc/versions) では動作しません。
    - ARM 向けには、Rockchip RK3568 / RK3588 SoC のハードウェアエンコーダーに対応しています。
      - arm64 のみに対応しています。armhf などの 32bit ARM には対応していません。
      - ラズパイ4はハードウェアエンコーダーが非力なのと入手性が微妙なため、サポート予定はありません。
      - ARM 向けのインストーラーも用意していますが、テスト不足のため、動作する保証はありません。
- **EDCB または Mirakurun**
  - KonomiTV のバックエンドには、EDCB または Mirakurun のいずれかを選択できます。
  - **EDCB は、220122 以降のバージョンの [xtne6f 版 EDCB](https://github.com/xtne6f/EDCB) / [tkntrec 版 EDCB](https://github.com/tkntrec/EDCB) にのみ対応しています。**
    - **220122 以前のバージョンの EDCB では正常に動作しません。「人柱版10.66」などの古いバージョンをお使いの場合は、EDCB のアップグレードが必要です。**
    - 230922 以降の xtne6f 版 / tkntrec 版 EDCB に更新すると EpgDataCap_Bon の起動が少し高速化され、KonomiTV でより快適にチャンネルを切り替えられるようになります。**
    - **最新の EDCB のビルド済みアーカイブは [tsukumijima/DTV-Builds](https://github.com/tsukumijima/DTV-Builds) にて配布しています。** こだわりがなければ、DTV-Builds で配布しているアーカイブの利用を強くおすすめします (動作確認も DTV-Builds で配布しているアーカイブで行っています)。
    - **KonomiTV と連携するには、さらに EDCB に事前の設定が必要になります（後述）。**
  - **Mirakurun は 3.9.0 以降を推奨します。**
    - 3.8.0 以下のバージョンでも動作しますが、諸問題で推奨しません。
    - リバースプロキシなどで Mirakurun に Basic 認証が掛かっていると正常に動作しません。

### クライアント

- **PC: Google Chrome**
  - **Windows 版 Microsoft Edge は https://github.com/tsukumijima/KonomiTV/issues/58 の問題 (Edge 側のバグ) があるため非推奨です。**
    - 仮にこの問題がなかったとしても、Microsoft Edge では通信節約モード (HEVC) での視聴に有料の [HEVC ビデオ拡張機能](https://apps.microsoft.com/detail/9NMZLZ57R3T7) プラグインが別途必要になります。
    - Chrome ではこのような制約はないため、Chrome を使うことをおすすめします。
  - Firefox でも動作するはずですが、コメント描画が重く、コメント表示をオンにするとライブストリーミングが時折止まることが確認されています。
    - 動作確認も基本行っておらず、積極的なサポートはしていません。Chrome を使うことをおすすめします。
  - Mac Safari はサポートしていません。Mac でも Chrome を使ってください。
- **Android: Google Chrome**
  - Android の Firefox はサポートしていません。
- **iPhone (iOS) / iPad (iPadOS): Safari**
  - **iOS / iPadOS 17.1 以降のみに対応しています。17.0 以前の iOS / iPadOS バージョンのサポートは廃止されました。**
    - iOS 17.1 で ManagedMediaSource API がサポートされたため、KonomiTV 0.9.0 以降では iOS / iPadOS でも PC・Android と同じ再生方式 (mpegts.js) で再生します。
    - メンテナンスコストの観点から、以前の LL-HLS 再生方式は廃止されました。iPadOS では 17.0 以前でも一応動作しますが、iOS では 17.1 以降でないと視聴開始に失敗します。
  - 動作確認は iOS / iPadOS 17.1 で行っています。
  - **iOS / iPadOS の Chrome (WKWebView) はサポートしていません。**
  - Safari は全体的にバグが多く開発が大変なため、全体的にあまり動作確認を行えていません。修正できていない不具合があるかもしれません。
  - PWA でも動作しますが、Safari 側のバグにより、PWA モードでは残念ながら Picture-in-Picture ボタンが動作しません。

## 備考・注意事項

- **現在 β 版で、まだ実験的なプロダクトです。当初よりかなり安定してきましたが、まだ完璧に保証ができる状態ではありません。**
  - 完成予想はおろか、TVRemotePlus で実装していた機能に関してもまだ完全にカバーできていないため、現時点で TVRemotePlus を代替できるレベルには達していません。
- **TVRemotePlus の後継という位置づけのソフトですが、それはあくまで精神的なものであり、実際の技術スタックや UI/UX はゼロから設計されています。**
  - 確かに TVRemotePlus の開発で得られた知見を数多く活用していますし開発者も同じではありますが、ユーザービリティや操作感は大きく異なるはずです。
  - TVRemotePlus の技術スタックでは解決不可能なボトルネックを根本的に解消した上で、「同じものを作り直す」のではなく、ゼロから新しいテレビ視聴・録画視聴のユーザー体験を作り上げ、追求したいという想いから開発しています。
  - どちらかというと録画視聴機能の方がメインの予定でいますが、前述のとおり、現時点ではテレビのライブ視聴機能のみの実装です。構想は壮大ですが、全て実装し終えるには数年単位で時間がかかるでしょう。
- **スマートフォンでは、最低限 iPhone SE2 (4.7インチ) 以上の画面サイズが必要です。**
  - 快適に利用するには、画面サイズが 6.1 インチ以上の端末をおすすめします。
  - iPhone 5s (4インチ) サイズには対応しておらず、画面が大幅に崩れます。
- **Fire タブレット (Fire HD 10 (2021) / Fire HD 8 (2022)) でも動作します。**
  - Fire HD 10 (2021) では Google Play を導入した上で、Google Play 経由で Chrome をインストールしてください。
  - Fire HD 8 (2022) では現状 Google Play が導入できないため、適宜 Chrome の APK を入手してインストールしてください。Chrome は、(Google アカウントとの同期機能以外は) GMS がインストールされていなくても動作します。
  - **Fire HD 10 (2021) などの一部のローエンド Android (特に MediaTek SoC 搭載) デバイスでは、1080p 以上の映像描画が不安定なことが確認されています。** その場合は 720p 以下の画質を選択することをおすすめします。
- **今後、開発の過程で設定や構成が互換性なく大幅に変更される可能性があります。**
- **ユーザービリティなどのフィードバック・不具合報告・Pull Requests (PR) などは歓迎します。**
  - 技術スタックはサーバー側が Python 3.11 + [FastAPI](https://github.com/tiangolo/fastapi) + [Tortoise ORM](https://github.com/tortoise/tortoise-orm) + [Uvicorn](https://github.com/encode/uvicorn) 、クライアント側が Vue.js 2.x + [Vuetify](https://github.com/vuetifyjs/vuetify) 2.x の SPA です。
    - Vuetify は補助的に利用しているだけで、大部分は独自で書いた SCSS スタイルを適用しています。
  - コメントを多めに書いたりそれなりにきれいにコーディングしているつもりなので、少なくとも TVRemotePlus なんかよりかは読みやすいコードになっている…はず。
  - 他人が見るために書いたものではないのであれですが、一応自分用の [開発資料](https://mango-garlic-eff.notion.site/KonomiTV-90f4b25555c14b9ba0cf5498e6feb1c3) と [DB設計](https://mango-garlic-eff.notion.site/KonomiTV-544e02334c89420fa24804ec70f46b6d) 的なメモを公開しておきます。もし PR される場合などの参考になれば。

## 事前準備

### チューナーのドライバーを px4_drv に変更する

必須ではありませんが、**Windows で PLEX 製チューナーを利用している場合は、事前にドライバーを [px4_drv for WinUSB](https://github.com/tsukumijima/px4_drv) に変更しておくことを強く推奨します。**
px4_drv では、公式ドライバーとの比較で、チューナーの起動時間が大幅に短縮されています。
その分 KonomiTV での視聴までにかかる待機時間も速くなるため（5秒以上速くなる）、より快適に使えます。

**px4_drv を導入すると、ほかにもドロップが大幅に減って安定するなど、たくさんのメリットがあります！**
内蔵カードリーダーが使えないこと、BonDriver の差し替えが必要になることだけ注意してください。

> [!NOTE]
> px4_drv for WinUSB のビルド済みアーカイブは [tsukumijima/DTV-Builds](https://github.com/tsukumijima/DTV-Builds) にて配布しています。

### EDCB の事前設定

**EDCB バックエンドでは、いくつか EDCB に事前の設定が必要です。**
**この事前設定を行わないと KonomiTV は正常に動作しません。 必ず下記のとおりに設定してください。**

**また、必ず 220122 以降のバージョンの [xtne6f 版 EDCB](https://github.com/xtne6f/EDCB) / [tkntrec 版 EDCB](https://github.com/tkntrec/EDCB) を利用していることを確認してください。**
現在利用している EDCB のバージョンは、EpgTimer の設定ウインドウの下に表示されています。**KonomiTV でサポートしていない古い EDCB では、このバージョン表示自体がありません。**

> [!NOTE]
> **230922 以降の xtne6f 版 / tkntrec 版 EDCB に更新すると EpgDataCap_Bon の起動が少し高速化され、KonomiTV でより快適にチャンネルを切り替えられるようになります。**

**[動作環境] に記載のとおり、220122 以前や「人柱版10.66」などの古いバージョンをお使いの場合は、EDCB のアップグレードが必要になります。**
**最新版の EDCB のビルド済みアーカイブは [tsukumijima/DTV-Builds](https://github.com/tsukumijima/DTV-Builds) にて配布しています。**
特にこだわりがなければ、このビルド済みアーカイブで事前に EDCB を最新版にアップグレードしておいてください。

-----

**EpgTimer を開き、[設定] → [動作設定] → [全般] から、[EpgTimerSrv の設定画面を開く] をクリックして、EpgTimerSrv の設定画面を開きます。**
さらに [その他] タブに切り替え、以下のとおりに設定してください。

- **[視聴に使用する BonDriver] に BonDriver を追加する**
  - **EDCB に登録している BonDriver のうち、ここで設定した BonDriver だけが KonomiTV での視聴に利用されます。**
  - [視聴に使用する BonDriver] に追加した BonDriver がすべて録画に使われているときは、KonomiTV からは視聴できません（チューナー不足と表示されます）。
  - また、KonomiTV での視聴中に録画が開始されたとき、その時点でチューナーが足りない場合は録画予約が優先され、KonomiTV 向けのストリーム配信は停止されます。
- **[ネットワーク接続を許可する (EpgTimerNW 用)] にチェックを入れる**
  - この設定にチェックを入れることで、KonomiTV が TCP API 経由で EDCB と通信できるようになります。
- **[ネットワーク接続を許可する (EpgTimerNW 用)] → [アクセス制御] に、`+127.0.0.0/8,+10.0.0.0/8,+172.16.0.0/12,+192.168.0.0/16,+169.254.0.0/16,+100.64.0.0/10` と入力する**
  - [プライベート IP アドレス](https://wa3.i-3-i.info/word11977.html) と [Tailscale](https://tailscale.com/) の [100.x.y.z](https://tailscale.com/kb/1015/100.x-addresses/) アドレスからのアクセスを許可する設定です。
  - この数字の羅列の意味を理解している方以外は、そのままコピペして貼り付けることを強くおすすめします。
- **[ネットワーク接続を許可する (EpgTimerNW 用)] → [IPv6] のチェックを外す**
  - この設定にチェックを入れると、**IPv6 アドレスでアクセスできるようになる代わりに、IPv4 アドレスでのアクセスが一切できなくなります (落とし穴…)。**
  - [IPv4/IPv6 両対応にする設定ではない](https://github.com/xtne6f/EDCB/blob/work-plus-s-220921/Document/Readme_Mod.txt#L256) ため、チェックを外すことを強くおすすめします。
- **xtne6f 版 EDCB の場合、[EpgTimerSrv の応答を tkntrec 版互換にする (要再起動)] にチェックを入れる**
  - EDCB から局ロゴを取得する際に必要です。変更を適用するには、EpgTimerSrv (EpgTimer Service) を再起動してください。
  - tkntrec 版 EDCB では既定で有効になっています（設定項目自体がありません）。

-----

**また、EpgDataCap_Bon にも設定が必要です。**
**EpgDataCap_Bon を開き、[設定] → [ネットワーク設定] → [TCP送信] から、[SrvPipe] を選択して [追加] ボタンをクリックしてください。**
送信先一覧に `0.0.0.1:0-29 (SrvPipe)` と表示されていれば OK です。

> [!NOTE]
> SrvPipe とは、EpgDataCap_Bon で受信した放送波を EpgTimerSrv (EpgTimer Service) に渡すための、EDCB 固有の特殊な名前付きパイプのことです。
> KonomiTV は SrvPipe を経由して EDCB から放送波を受信しているため、この設定を忘れると、テレビのライブストリーミングができません。

> [!NOTE]
> 必須ではありませんが、この機会に [設定] → [動作設定] → [全サービスを処理対象とする] のチェックを外しておくことを推奨します。

このほか、**リモート PC の KonomiTV から EDCB にアクセスする場合は、EpgTimerSrv.exe にファイアウォールが掛かっていると接続に失敗します。**
適宜ファイアウォールの設定を変更し、EDCB に接続できるようにしておいてください。

### QSVEncC・NVEncC・VCEEncC・rkmppenc に対応した GPU ドライバーのインストール

KonomiTV は、[QSVEncC](https://github.com/rigaya/QSVEnc) (Intel QSV)・[NVEncC](https://github.com/rigaya/NVEnc) (NVIDIA NVENC)・[VCEEncC](https://github.com/rigaya/VCEEnc) (AMD VCE)・[rkmppenc](https://github.com/rigaya/rkmppenc) (Rockchip ARM SoC) の4つのハードウェアエンコーダーに標準で対応しています。

> FFmpeg (ソフトウェアエンコーダー) は遅い上に CPU 負荷がかなり高くなるため、ハードウェアエンコーダーの利用を強くおすすめします。

#### Windows

- QSVEncC：[Intel Graphics Driver](https://downloadcenter.intel.com/ja/product/80939/Graphics-Drivers)
- NVEncC：[NVIDIA Graphics Driver](https://www.nvidia.co.jp/Download/index.aspx)
- VCEEncC：[AMD Graphics Driver](https://www.amd.com/ja/support)

それぞれのハードウェアエンコーダーを使用するには、対応した GPU ドライバーのインストールが必要です。
基本的にすでにインストールされていると思います。

> [!NOTE]
> 古いドライバーを使用している場合は、この機会に最新のドライバーにアップデートしておくことをおすすめします。ドライバーが古すぎると、ハードウェアエンコードに失敗する場合があります。

#### Linux

QSVEncC では、別途 Intel Media Driver のインストールが必要です。

> [!WARNING]
> Linux 版の Intel QSV は、Broadwell (第5世代) 以上の Intel CPU でのみ利用できます。そのため、Haswell (第4世代) 以下の CPU では、Intel Media Driver のインストール有無にかかわらず、QSVEncC を利用できません。
> なお、Windows 版の Intel QSV は、Haswell (第4世代) 以下の CPU でも利用できます。

```bash
curl -fsSL https://repositories.intel.com/graphics/intel-graphics.key | sudo gpg --dearmor --yes -o /usr/share/keyrings/intel-graphics-keyring.gpg

# Ubuntu 22.04 LTS
echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/intel-graphics-keyring.gpg] https://repositories.intel.com/graphics/ubuntu jammy arc' | sudo tee /etc/apt/sources.list.d/intel-graphics.list > /dev/null
# Ubuntu 20.04 LTS
echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/intel-graphics-keyring.gpg] https://repositories.intel.com/graphics/ubuntu focal-devel main' | sudo tee /etc/apt/sources.list.d/intel-graphics.list > /dev/null

sudo apt update && sudo apt install -y intel-media-va-driver-non-free intel-opencl-icd libmfxgen1
```

以上のコマンドを実行して、Intel Media Driver をインストールしてください (Ubuntu 20.04 LTS 以降向け) 。

> [!NOTE]
> Docker を使ってインストールする場合は、Intel Media Driver をインストールしなくても動作します（未検証）。
> [KonomiTV の Docker イメージ](https://github.com/tsukumijima/KonomiTV/blob/master/Dockerfile) には Intel Media Driver が標準でインストールされているほか、Intel Graphics 本体のドライバは Linux カーネルに取り込まれているためです。

> [!NOTE]
> 以前 Alder Lake (第12世代) 以降の Intel CPU で必要だった `libmfx-gen1.2` は、[QSVEncC 7.38](https://github.com/rigaya/QSVEnc/releases/tag/7.38) 以降で `libmfxgen1` に置き換えられました。
> `libmfxgen1` は、Ubuntu 20.04 LTS 以降で利用できます。

> [!WARNING]
> **Jasper Lake 世代などの一部の CPU や Arc GPU では、別途 HuC ファームウェアのロードを有効にする必要があります。**
> HuC ファームウェアのロードを有効にするには、`/etc/modprobe.d/i915.conf` にカーネルパラメーターとして `options i915 enable_guc=2` を追記し、システムを再起動してください。
> 詳細は [QSVEncC のドキュメント](https://github.com/rigaya/QSVEnc/blob/master/Install.ja.md) を確認してください。

-----

NVEncC では、[NVIDIA Graphics Driver](https://www.nvidia.co.jp/Download/index.aspx) のインストールが必要です。
基本的にはすでにインストールされていると思います。個人的には `ubuntu-drivers` コマンドを使って apt でインストールするのがおすすめです。

**Docker を使って KonomiTV をインストールする場合は (後述) 、さらに NVIDIA Container Toolkit のインストールが必要です。**

```bash
# Ubuntu では nvidia-docker2 パッケージをインストールするだけ
sudo apt install -y nvidia-docker2
```

-----

VCEEncC では、[AMDGPU-PRO Driver](https://www.amd.com/ja/support/linux-drivers) のインストールが必要です。
古いドライバーがインストールされていると、VCEEncC を利用できないことがあります。最新のドライバーをインストールしてください。

```bash
# Ubuntu 20.04 LTS (2022/11時点で最新の amdgpu-install パッケージの URL)
curl -LO https://repo.radeon.com/amdgpu-install/22.20/ubuntu/focal/amdgpu-install_22.20.50200-1_all.deb
# Ubuntu 22.04 LTS (2022/11時点で最新の amdgpu-install パッケージの URL)
curl -LO https://repo.radeon.com/amdgpu-install/22.20/ubuntu/jammy/amdgpu-install_22.20.50200-1_all.deb

# AMDGPU-PRO Driver のインストール
sudo apt install -y ./amdgpu-install_22.20.50200-1_all.deb
sudo apt update && sudo amdgpu-install -y --accept-eula --usecase=graphics,amf,opencl --opencl=rocr,legacy --no-32

# 再起動
sudo reboot
```

以上のコマンドを実行して、AMDGPU-PRO Driver をインストールしてください (Ubuntu 20.04 LTS 以降向け) 。

-----

rkmppenc のサポートは試験的なものです。また、Rockchip 製 ARM SoC (RK3588/RK3588S など) でのみ利用できます。

```bash
# Mali GPU Driver のインストール (RK3588/RK3588S 向け)
## 他の Rockchip SoC の Mali GPU Driver は https://github.com/tsukumijima/libmali-rockchip/releases から入手できる
## RK3588/RK3588S の場合、g610-g6p0 より g610-g13p0 の方が高速に動作する
wget https://github.com/tsukumijima/libmali-rockchip/releases/download/v1.9-1-55611b0/libmali-valhall-g610-g13p0-wayland-gbm_1.9-1_arm64.deb
sudo apt install -y ./libmali-valhall-g610-g13p0-wayland-gbm_1.9-1_arm64.deb
rm libmali-valhall-g610-g13p0-wayland-gbm_1.9-1_arm64.deb

# rockchip-multimedia-config のインストール
## Rockchip のハードウェアエンコーダーを有効化するための設定パッケージ
wget https://github.com/tsukumijima/rockchip-multimedia-config/releases/download/v1.0.2-1/rockchip-multimedia-config_1.0.2-1_all.deb
sudo apt install -y ./rockchip-multimedia-config_1.0.2-1_all.deb
rm rockchip-multimedia-config_1.0.2-1_all.deb

# 念のため再起動
sudo reboot
```

以上のコマンドを実行して、Mali GPU Driver と、Rockchip のハードウェアエンコーダーを有効化するための設定パッケージをインストールしてください (Ubuntu 20.04 LTS / Debian 11 Bullseye 以降向け) 。

### Tailscale の導入

**KonomiTV で外出先からリモート視聴するには、Tailscale というメッシュ VPN ソフトを、サーバー PC とクライアントデバイス双方にインストールしておく必要があります。**

> [!NOTE]
> KonomiTV を家の中だけで使う分には必須ではありませんが、セットアップがとっても簡単で時間もそこまでかからないので、この機会にインストールしておくことをおすすめします。

> [!NOTE]
> 厳密にはほかの方法 (OpenVPN・SoftEther・リバースプロキシなど) でもリモート視聴は可能ですが、技術的に難易度がかなり高くネットワークエンジニア以外には難しいこと、Tailscale を使った方法が一番手軽でセキュアなことから、**KonomiTV では Tailscale を使ったリモート視聴方法のみ公式にサポートしています。**
> **特にリバースプロキシ経由でのアクセスでは一部機能が正常に動作しなくなるほか、セキュリティ上の問題もあるため、非推奨です。**

Tailscale は、デバイスが接続されているネットワークや物理的距離に関係なく、**同じアカウントにログインしている Tailscale クライアント (デバイス) 同士で直接通信できる、次世代型のメッシュ VPN です。**

VPN サーバーを介さず Tailscale クライアント同士で直接通信するため、通常の VPN よりも高速です。さらに通信は暗号化されるため、セキュアに外出先から自宅のデバイスへアクセスできます。

**さらに、デバイスをほかの Tailscale ユーザーとシェアすることもできます。**
Google ドライブでファイルへの招待リンクを作って共同編集したい人に送るのと同じ要領で、Tailscale クライアントをインストールしたデバイスをほかのユーザーとシェアできます。
KonomiTV を共有したい家族や親戚に Tailscale アカウントを作成してもらえば、Tailscale ログイン用の Google / Microsoft / GitHub アカウントを家族間で共有することなく、セキュアに KonomiTV をシェアできます。

**Tailscale の詳細や導入方法は、以前私が執筆した **[こちら](https://blog.tsukumijima.net/article/tailscale-vpn/)** の記事をご覧ください。**
この記事のとおりにセットアップすれば、あとは各デバイスで Tailscale での VPN 接続をオンにしておくだけです。

**KonomiTV での利用以外にも、EDCB Material WebUI や EPGStation などの、プライベートネットワーク上の Web サーバーに家の外からアクセスするときにとても便利なサービスです。**
100台までは無料ですし (逸般の誤家庭でなければ十分すぎる)、この機会に導入しておくことをおすすめします。

## サーバーのインストール/アップデート

**KonomiTV には、インストーラー/アップデーター/アンインストーラーの3つのモードを内包した、CLI ベースのインストーラーがあります。**
このインストーラーを使えば、とてもかんたんに KonomiTV をインストール/アップデートできます！

**インストール時は、KonomiTV のインストーラーを起動したあと、最初の質問で `1` を入力します。**
あとは、インストーラーの通りに進めていくだけで、自動的にインストールが開始されます！詳しくは下記のインストール手順をご覧ください。

**アップデート/アンインストール時は、KonomiTV のインストーラーを起動したあと、最初の質問でアップデートでは `2` 、アンインストールでは `3` を入力します。**
**その後、KonomiTV がインストールされているフォルダを入力すると、自動的にアップデート/アンインストールが開始されます！**

> [!NOTE]
> インストール/アップデートにはインターネット接続が必要です。オフラインインストーラーではないため注意してください。

> [!WARNING]
> **KonomiTV サーバーは特殊な仕組みで動作しているため、通常のアプリと異なり Windows の「設定」や「プログラムと機能」からアンインストールすることはできません。**
> アンインストールする際は、**必ず KonomiTV のインストーラー (アンインストーラーモード) を使ってアンインストールしてください。**
> インストーラーには後方互換性があるため、インストールされているバージョンより新しいバージョンのインストーラーを使ってアンインストールすることもできます。

**以下はインストール時の手順になります。**
アップデート/アンインストールする際は適宜読み替えてください。

> [!WARNING]
> KonomiTV は鋭意開発中のため、現在破壊的な構成変更が頻繁に行われています。
> 破壊的変更が続く中アップデーターの機能を維持することは難しいため、**安定版リリースまでの当面の間、アップデーターの今後の改修は凍結されています。**
> お手数をおかけしますが、**0.7.1 以前から 0.8.0 以降へのアップデートは、適宜データベース (`server/data/database.sqlite`) や設定ファイル (`config.yaml`) などをバックアップの上で一旦アンインストールし、新規でインストールし直すことを強くおすすめします。**
> 0.8.0 から 0.9.0 以降へのアップデートは動作する可能性がありますが、0.7.1 以前からのアップデートでは大幅な構成変更が入っているため、確実に動作しません。
> **なお、0.7.1 のアンインストールには 0.7.1 のインストーラーが必要です。0.8.0 以降のインストーラーではアンインストールに失敗するため注意してください。**

> [!NOTE]
> **インストーラーを実行する前に、当該バージョンの [リリースノート](https://github.com/tsukumijima/KonomiTV/releases) を一読しておくことを強く推奨します。**
> 各バージョンごとのインストール時の注意点なども、すべてリリースノートに記載されています。

### Windows

[動作環境] に記載のとおり、Windows 10 以降の 64bit OS にのみ対応しています。
Windows 8 以前と、32bit OS には対応していません。

**[Releases](https://github.com/tsukumijima/KonomiTV/releases) ページから、最新の KonomiTV のインストーラーをダウンロードします。**
Assets の下にある `KonomiTV-Installer.exe` をダウンロードしてください。

> [!NOTE]
> **`KonomiTV-Installer.exe` がウイルス対策ソフトにウイルスと扱われてしまうことがありますが、誤検知です。一般に Python 製ソフトを exe 化すると問答無用でウイルスだと扱われてしまうことが多く、頭を抱えています…。**
> 適宜お使いのウイルス対策ソフトで、`KonomiTV-Installer.exe` を許可してください。KonomiTV のインストーラーのソースコードは [こちら](https://github.com/tsukumijima/KonomiTV/tree/master/installer) で公開しています。

**ダウンロードが終わったら、`KonomiTV-Installer.exe` をダブルクリックで実行します。**
インストールには管理者権限が必要です。

**あとは、インストーラーの通りに必要事項を入力していけば、インストールがはじまります！**
スペックにもよりますが、インストールには少し時間がかかります。気長に待ちましょう。

**インストール処理の終盤で、KonomiTV の実行ユーザー名と、パスワードの入力を求められます。**

これは KonomiTV の Windows サービスを一般ユーザーの権限で起動するために利用するものです。入力されたユーザー名やパスワードがそれ以外の用途に利用されることはありません。
実行ユーザー名を入力せずに Enter キーを押すと、デフォルトで現在ログオン中のユーザーが利用されます。
なお、PIN などのほかの認証方法には対応していません。必ず通常のパスワードを入力してください。

KonomiTV の Windows サービスを一般ユーザーの権限で起動することで、KonomiTV からユーザーのネットワークドライブにアクセスできるようになります。

> [!WARNING]
> **KonomiTV の Windows サービスは、PC の起動後数分遅れてから起動します。** PC の起動直後は EDCB や Mirakurun の Windows サービスがまだ起動していないためです。

> [!NOTE]
> 指定したユーザーにパスワードを設定していない場合は、簡単なものでいいので何かパスワードを設定してから、その設定したパスワードを入力してください (なお、パスワードの設定後にインストーラーを起動し直す必要はありません) 。

> [!NOTE]
> ごく稀に、正しいパスワードを指定したにも関わらず、ログオンできない場合があります。その場合は、一度インストーラーを Ctrl+C で中断してください。
その後、インストーラーの実行ファイル (`KonomiTV-Installer.exe`) を Shift + 右クリック → [[別のユーザーとして実行]](https://faq.nec-lavie.jp/qasearch/1007/app/servlet/relatedqa?QID=020525) をクリックして、ログオン中のユーザー名とパスワードを指定してから、再度インストーラーを実行してみてください。

> [!NOTE]
> セキュリティソフトの誤作動により、インストール途中にエラーが発生し、インストールに失敗することがあります。
> その場合は一時的にセキュリティソフトのリアルタイムスキャンをオフにしたり、インストール先のフォルダをスキャン対象から除外してから、再度インストーラーを実行してみてください。

### Linux

[動作環境] に記載のとおり、Ubuntu 20.04 LTS / Debian 11 Bullseye 以降の OS にのみ対応しています。
それ以外のディストリビューションでも動くかもしれませんが、動作は保証しませんし、今後のサポート予定もありません（Docker ならどの OS でもそれなりに動くような気はします）。

> [!NOTE]
> できるだけ Ubuntu の利用を推奨しますが、もし Ubuntu 以外の OS にインストールする際は、Docker でのインストールをおすすめします。

> [!WARNING]
> NVIDIA が KonomiTV で利用していたバージョンの CUDA Docker イメージを削除した影響で ([詳細1](https://twitter.com/TVRemotePlus/status/1683860609555898369) / [詳細2](https://twitter.com/TVRemotePlus/status/1689227380664209409)) 、0.7.1 以前では Docker を使ったインストール方法が利用できなくなりました。
> 0.8.0 以降のバージョンでは CUDA Docker イメージの pull 先を [NGC](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda/tags) に変更しています。0.8.0 以降へのアップデートをお願いします。

**Linux 向けの KonomiTV には、通常のインストール方法と、Docker を使ったインストール方法の 2 通りがあります。**

**通常のインストール方法では、事前に [PM2](https://PM2.keymetrics.io/docs/usage/quick-start/) と [Node.js](https://github.com/nodesource/distributions) (PM2 の動作に必要) のインストールが必要です。**
[Mirakurun](https://github.com/Chinachu/Mirakurun) や [EPGStation](https://github.com/l3tnun/EPGStation) を Docker を使わずにインストールしているなら、すでにインストールされているはずです。
また、インストーラーの実行時に `lshw` コマンドが必要です。`lshw` がインストールされていない場合は、適宜インストールしてください。

**Docker を使ったインストール方法では、事前に [Docker](https://docs.docker.com/engine/install/) と [Docker Compose](https://docs.docker.com/compose/install/) のインストールが必要です。**
Docker Compose は V1 と V2 の両方に対応していますが、できれば V2 (ハイフンなしの `docker compose` コマンド) が使えるようにしておくことをおすすめします。
**なお、Ubuntu 公式 apt リポジトリの Docker / Docker Compose は古いバージョンで固定されているため、必ず Docker 公式 apt リポジトリからインストール・アップデートを行うようにしてください。** 古い Docker / Docker Compose では正常に動作しません。

> [!WARNING]
> **ARM デバイスでは、対応コストの観点から Docker を使ったインストール方法はサポートされていません。**

> [!WARNING]
> **Docker Compose V1 は最終版の 1.29.2 でのみ動作を確認しています。古いバージョンでは正常に動作しない可能性が高いです。**
> もし Docker Compose V1 が 1.29.2 よりも古い場合は、この機会に V2 への更新をおすすめします。以前よりもグラフィカルに進捗が表示されたりなどのメリットもあります。

> [!WARNING]
> [QSVEncC・NVEncC・VCEEncC・rkmppenc に対応した GPU ドライバーのインストール](#qsvenccnvenccvceenccrkmppenc-に対応した-gpu-ドライバーのインストール) に記載のとおり、**NVIDIA GPU が搭載されている PC に Docker を使ってインストールする場合は、必ず事前に NVIDIA Container Toolkit をインストールしておいてください。**
> NVIDIA Container Toolkit がインストールされていない場合、KonomiTV のインストールにも失敗する可能性が高いです。

> [!NOTE]
> Docker を使ってインストールする場合、動作環境によっては `getaddrinfo EAI_AGAIN registry.yarnpkg.com` といったエラーで Docker イメージのビルドに失敗することがあります。
> Docker の DNS 設定がおかしかったり、Docker が書き換える iptables の定義が壊れてしまっていることが原因のようで、解決方法は千差万別です。
> KonomiTV は通常のインストール方法でも極力環境を汚さないように開発されています。Docker を使わずに通常通りインストールしたほうが早いかもしれません。
> 参考: https://e-tipsmemo.hatenablog.com/entry/2024/04/07/000000

```bash
curl -LO https://github.com/tsukumijima/KonomiTV/releases/download/v0.10.1/KonomiTV-Installer.elf
chmod a+x KonomiTV-Installer.elf
./KonomiTV-Installer.elf
```

以上のコマンドを実行して `KonomiTV-Installer.elf` を実行し、インストーラーの通りに進めてください。
インストールには root 権限が必要です。`KonomiTV-Installer.elf` の実行時に自動的にパスワードを求められます。

> [!NOTE]
> ARM デバイスでは、`KonomiTV-Installer.elf` の代わりに `KonomiTV-Installer-ARM.elf` をダウンロードしてください。

### KonomiTV にアクセスする

**「インストールが完了しました！ すぐに使いはじめられます！」と表示されたら、KonomiTV サーバーのインストールは完了です！おつかれさまでした！！🎉🎊**
インストーラーに記載されている URL から、KonomiTV の Web UI にアクセスしてみましょう！

**通常、`(イーサネット)` または `(Wi-Fi)` の URL が家の中からアクセスするときの URL 、`(Tailscale)` の URL が外出先（家の外）から Tailscale 経由でアクセスするときの URL になります。**

> [!NOTE]
> `https://my.local.konomi.tv:7000/` の URL は、KonomiTV サーバーをインストールした PC 自身を指す URL ([ループバックアドレス](https://wa3.i-3-i.info/word1101.html)) です。基本的に使うことはないと思います。

> [!NOTE]
> `(Tailscale)` の URL は、事前に Tailscale を導入していない場合は表示されません（外出先からのアクセス自体は、Tailscale をいつ導入したかに関わらず、Tailscale が起動していれば問題なく行えます）。

KonomiTV サーバーは Windows サービス (Windows) / PM2 サービス (Linux) / Docker サービス (Linux-Docker) としてインストールされているので、サーバー PC を再起動したあとも自動的に起動します。
もし再起動後に KonomiTV にアクセスできない場合は、`server/logs/KonomiTV-Server.log` に出力されているエラーメッセージを確認してください。

> [!TIP]
> ぜひこの機会に KonomiTV の公式 Twitter をフォローしていただけると嬉しいです！
> KonomiTV の開発進捗やユーザーのみなさんへのお知らせなどを随時ツイートしています。
> 各種 Tips もツイートしていますので、もし導入時に分からない箇所があれば、一度ツイートを検索してみると解決策が見つかるかもしれません。
>
> [![Twitter](https://img.shields.io/twitter/follow/KonomiTV?style=social)](https://twitter.com/TVRemotePlus)

### デスクトップアプリ・スマホアプリとして使う

**PC 版 Chrome や Edge では、URL バー右のアイコン → [アプリをインストール] から、KonomiTV をブラウザバーのないデスクトップアプリとしてインストールできます！**
ブラウザバーが表示されない分、より映像に没頭できますし、画面も広く使えます。私も KonomiTV をデスクトップアプリとして使っています。
タスクバーや Dock に登録しておけば、起動するのも簡単です。ぜひお試しください。

> [!NOTE]
> デスクトップアプリとしてインストールしない場合は、[サイトの設定] から自動再生を [許可する] にしておくと、テレビをスムーズに視聴できます。

**Android Chrome では下に表示される [ホーム画面に追加] またはメニューの [アプリをインストール] から、iPhone / iPad Safari では共有メニュー → [ホーム画面に追加] から、それぞれ KonomiTV をブラウザバーのないスマホアプリとしてインストールできます！**

スマホは画面が小さいので、アプリとしてインストールした方が画面が広くなって使いやすいです。私も KonomiTV をスマホアプリとして使っています。こちらもぜひお試しください。

> [!WARNING]
> 現状、iPhone / iPad Safari で KonomiTV をスマホアプリとしてインストールすると、Safari のバグの影響で Picture-in-Picture ボタンが利用できなくなります。
> とはいえ Picture-in-Picture を使わないのであれば、アプリとしてインストールした方が圧倒的に快適です。

> [!NOTE]
> [PWA (Progressive Web Apps)](https://developer.mozilla.org/ja/docs/Web/Progressive_web_apps) という、Web アプリを通常のネイティブアプリのように使えるようにする技術を利用しています。将来的には、PWA だけでなく、より快適に利用できるようにした iOS 向けアプリと Android 向けアプリ (いわゆるガワアプリ) をリリースする予定です。

### フィードバックのお願い

**KonomiTV はまだまだ開発中のソフトウェアです。**

機能が多岐に渡ることと、もとよりテレビのストリーミングという特殊で複雑な技術を扱っていることから、テストが追いつかず慢性的な検証不足に陥っています。
できるだけ手元の環境で検証やテストを行うようにはしていますが、すべての環境や条件を網羅できているわけではありませんし、不具合や問題が残っている可能性は十分にあります。

**もし KonomiTV を使っていて、何か不具合や問題が発生した場合は、ぜひ [Google フォーム](https://docs.google.com/forms/d/e/1FAIpQLScWKzmfCat4w9n9Jp4_P1dIFzewzV4qO-7_BJOcs5Zdvt6yPA/viewform) からフィードバックをお願いします…！！**
**フィードバックしていただけると、KonomiTV の品質改善に大いに役立ちます！**

> [!NOTE]
> できればマイナーな条件や機能の組み合わせで問題が出ないか、各自でテストしていただけるととても助かります…！
> その際、フィードバックフォームには試した環境や条件などを詳細に記載していただけると、問題の再現性が高まります。
>
> KonomiTV ではユーザビリティ (使いやすさ) を第一に考えて UI や細部の機能を緻密に設計しています。
> 「〇〇の機能/画面が使いづらい」といったフィードバックや、新しい機能のリクエストも大歓迎です。

みなさんからのフィードバックにすべて応えることはできませんが、いただいたフィードバックは KonomiTV の機能向上や改善に役立てさせていただきます！

## 付録

### `https://aa-bb-cc-dd.local.konomi.tv:7000/` の URL について

**この `https://aa-bb-cc-dd.local.konomi.tv:7000/` のフォーマットの URL は、KonomiTV の WebUI に HTTPS でアクセスするための特殊な URL です。**

aa-bb-cc-dd の部分には、ローカル IP アドレスのうち、. (ドット) を - (ハイフン) に置き換えた値が入ります。
つまり、サーバー PC のローカル IP アドレスが `192.168.1.11` だったとしたら、`https://192-168-1-11.local.konomi.tv:7000/` という URL になります。

> [ループバックアドレス](https://wa3.i-3-i.info/word1101.html) のみ、`https://127-0-0-1.local.konomi.tv:7000/` の代わりに、
> ・`https://my.local.konomi.tv:7000/`
> ・`https://local.local.konomi.tv:7000/`
> ・`https://localhost.local.konomi.tv:7000/`
> のシンプルな URL でアクセスできます。

通常、自宅のローカル LAN 上の Web サイトには、`http://192.168.1.11:8000/` のような IP アドレス直打ちでの HTTP アクセスがほとんどです。EDCB Material WebUI・TVRemotePlus・Mirakurun・EPGStation などの DTV 関連のソフトでも、同様のアクセス方法が取られてきました。

…ところが、最近のブラウザはインターネット上に公開されている Web サイトのみならず、盗聴のリスクが著しく低いローカル LAN 上の Web サイトにも、HTTPS を要求するようになってきました。
すでに PWA の主要機能である [Service Worker](https://developer.mozilla.org/ja/docs/Web/API/Service_Worker_API) などをはじめ、近年追加された多くの Web API の利用に HTTPS が必須になってしまっています。こうした強力な API が HTTP アクセスでは使えないことが、KonomiTV を開発する上で大きな制約になっていました。

**そこで KonomiTV では、過去に例のない非常に特殊な仕組みを使い、プライベートネットワーク上の Web サービスにも関わらず [自己署名証明書](https://wa3.i-3-i.info/word18213.html) のインストールなしで HTTPS でアクセスできるようにしました。**
具体的には、Let's Encrypt の DNS 認証 / ワイルドカード証明書・ワイルドカード DNS・Keyless SSL の3つの技術を組み合わせています。**[tsukumijima/Akebi](https://github.com/tsukumijima/Akebi)** に技術解説とソースコードを載せていますので、よろしければご覧ください。

**この仕組み (Akebi) を使うには、`https://192-168-1-11.local.konomi.tv:7000/` のような HTTPS URL でアクセスする必要があります。** 当然ですが、プライベート IP アドレス単体では正式な証明書を取得できないためです。

> `https://(IPアドレス(.を-にしたもの)).local.konomi.tv:7000/` はすべてのプライベート IP アドレスに対応していますが、セキュリティ上の兼ね合いでグローバル IP アドレスには対応していません。
> なお、Tailscale の [100.x.y.z アドレス](https://tailscale.com/kb/1015/100.x-addresses/) には対応しています。

> どうしてもほかの URL でアクセスしたい方向けに、一応サーバー設定 (config.yaml) にカスタム HTTPS 証明書を指定する機能を用意しています。サポートは一切しませんので、すべて理解している方のみ行ってください。

### 設定ファイルの編集

**KonomiTV のサーバー設定は、KonomiTV をインストールしたフォルダにある config.yaml に保存されています。**

> [!IMPORTANT]
> **KonomiTV 0.10.0 以降では、サーバー設定を KonomiTV の UI 上で変更できるようになりました！**
> サーバー設定を変更するには、管理者権限を持つ KonomiTV アカウントでログインし、[設定] → [サーバー設定] に移動してください。
> KonomiTV サーバー内で一番最初に作成された KonomiTV アカウントには、既定で管理者権限が付与されています。

> [!WARNING]
> 0.7.1 以前に利用されていた config.yaml と 0.8.0 以降で利用されている config.yaml は、フォーマットの互換性がありません。
> KonomiTV は開発中のため、今後も設定ファイルの破壊的変更が発生する可能性があります。

> [!WARNING]
> config.example.yaml は、config.yaml のデフォルトの設定を記載した、config.yaml のひな形となるファイルです。
> アップデート時に上書きされるため、config.example.yaml は編集しないでください。

**config.yaml は、インストーラーでインストールした際に自動的に生成されます。**

以下は主要な設定項目の説明です。
ほかにも設定項目はありますが、基本的に変更の必要はありません。

#### バックエンドの設定

KonomiTV のバックエンドには、EDCB または Mirakurun のいずれかを選択できます。
`general.backend` に `EDCB` または `Mirakurun` を指定してください。

> [!WARNING]
> 一部 Windows 環境では localhost の名前解決が遅いため、チューナーが数秒遅れて起動し、ストリーミング開始までの待機時間が長くなる場合があります。
> EDCB / Mirakurun と同じ PC に KonomiTV をインストールしている場合、localhost ではなく 127.0.0.1 の利用を推奨します。

-----

EDCB をバックエンドとして利用する場合は、EDCB (EpgTimerNW) の TCP API の URL (`general.edcb_url`) をお使いの録画環境に合わせて編集してください。

通常、TCP API の URL は `tcp://(EDCBのあるPCのIPアドレス):4510/` になります。接続できない際は、ファイアウォールの設定や EpgTimer Service が起動しているかを確認してみてください。
前述のとおり、あらかじめ EDCB の事前設定を済ませておく必要があります。

> [!NOTE]
> TCP API の URL として `tcp://edcb-namedpipe/` と指定すると、TCP API の代わりに名前付きパイプで通信を行います（KonomiTV と EDCB が同じ PC で起動している場合のみ）。

-----

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

通常、HTTP API の URL は `http://(MirakurunのあるPCのIPアドレス):40772/` になります。接続できない際は、Mirakurun が起動しているかを確認してみてください。

#### エンコーダーの設定

エンコーダーには、ソフトウェアエンコーダーの FFmpeg のほか、ハードウェアエンコーダーの QSVEncC・NVEncC・VCEEncC・rkmppenc を選択できます。
`general.encoder` に `FFmpeg` / `QSVEncC` / `NVEncC` / `VCEEncC` / `rkmppenc` のいずれかを指定してください。

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

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

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

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

> [!WARNING]
> Linux 版の Intel QSV は、Broadwell (第5世代) 以上の Intel CPU でのみ利用できます。そのため、Haswell (第4世代) 以下の CPU では、QSVEncC を利用できません。
> なお、Windows 版の Intel QSV は、Haswell (第4世代) 以下の CPU でも利用できます。

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

**VCEEncC は、Radeon などの AMD 製 GPU に搭載されているハードウェアエンコード機能 (AMD VCE) を利用するエンコーダーです。**
QSVEncC・NVEncC に比べると安定しない上に、画質や性能もあまり良くありません。もし QSVEncC・NVEncC が使えるならそちらを使うことをおすすめします。

**rkmppenc は、RK3588 などの Rockchip 製 ARM SoC に搭載されているハードウェアエンコード機能 (mpp) を利用するエンコーダーです。**
画質は VCEEncC と同等くらいですが、ARM デバイスで利用できるハードウェアエンコーダーとしては最高レベルの性能を誇ります。

#### リッスンポートの設定

`server.port` に、KonomiTV サーバーのリッスンポートを指定してください。
デフォルトのリッスンポートは `7000` です。

> [!NOTE]
> インストーラーでのインストール時にポート 7000 がほかのサーバーソフトと重複している場合は、代わりのポートとして 7100 (7100 も利用できない場合は、さらに +100 される) が自動的にデフォルトのリッスンポートに設定されます。

基本的に変更の必要はありません。変更したい方のみ変更してください。

#### アップロードしたキャプチャ画像の保存先フォルダの設定

`capture.upload_folders` に、アップロードしたキャプチャ画像の保存先フォルダを指定してください。

クライアントの [キャプチャの保存先] 設定で [KonomiTV サーバーにアップロード] または [ブラウザでのダウンロードと、KonomiTV サーバーへのアップロードを両方行う] を選択したときに利用されます。

デフォルトの保存先フォルダは、インストーラーで入力したフォルダが自動的に設定されています。
保存先フォルダを変更したくなったときは、この設定を変更してください。

-----

**サーバー設定の変更を反映するには、KonomiTV サーバー (KonomiTV Service) の再起動が必要です。**

- Windows:「サービス」アプリを開いた後、サービス一覧の中から KonomiTV Service を探して、右クリックメニューから [再起動] をクリックしてください。
  - または、管理者権限のコマンドラインから `sc stop "KonomiTV Service"; sc start "KonomiTV Service"` を実行してください。
- Linux: `sudo pm2 restart KonomiTV` を実行してください。
  - `sudo` をつけないと正しく実行できません (KonomiTV は root ユーザーの PM2 プロファイルに登録されているため) 。
- Linux (Docker): KonomiTV をインストールしたフォルダで `docker compose restart` を実行してください。

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

### 局ロゴ

KonomiTV には、放送波から取得できるものよりも遥かに高画質な局ロゴが同梱されています。
ほとんどの地上波チャンネル・BS/CS の全チャンネル・一部の CATV のコミュニティチャンネルをカバーしており、受信できるチャンネルに対応する局ロゴが同梱されていれば、それが利用されます。

> [!NOTE]
> 放送波から取得できる局ロゴは最高でも 64x36 で、現代的なデバイスで見るにはあまりにも解像度が低すぎます。とはいえ、局ロゴがなければぱっとチャンネルを判別できなくなり、ユーザー体験が悪化してしまいます。
> さらに、局ロゴは何らかの事情で取得できていないことも考えられます。こういった事情もあり、高画質な局ロゴを同梱しています。

チャンネルに対応する局ロゴが同梱されていない場合は、Mirakurun・EDCB のいずれかから局ロゴの取得を試みます。Mirakurun または EDCB から局ロゴを取得できなかった場合は、デフォルトの局ロゴが利用されます。

- Mirakurun:
  - Mirakurun の API から局ロゴの取得を試みます。
  - 基本的には何もしなくても局ロゴが収集されているはずです。
- EDCB:
  - EDCB のロゴデータ保存機能で収集された局ロゴの取得を試みます。
    - ロゴデータ保存機能は [2020年10月に追加された](https://github.com/xtne6f/EDCB/commit/0457241ccdd83ae9847ab15a16157d04927b72ce) もので、KonomiTV が動作する 220122 以降のバージョンの EDCB なら問題なく利用できます。
  - EpgDataCap_Bon の設定 → [EPG取得設定] → [ロゴデータを保存する] にチェックが入っていて、なおかつ `EDCB/Settings/LogoData/` にロゴデータ (PNG) が保存されていることが条件です。

> [!NOTE]
> 同梱されているロゴは `server/static/logos/` に `NID(ネットワークID)-SID(サービスID).png` (解像度: 256×256) のフォーマットで保存されています。
> チャンネルのネットワーク ID とサービス ID がわかっていれば、自分で局ロゴ画像を作ることも可能です。

## FAQ

### Web UI にアクセスすると 502 Bad Gateway エラーが表示される

KonomiTV サーバーの起動中と考えられます。しばらく待ってから再度アクセスしてみてください。

数分待ってもアクセスできない場合は、KonomiTV サーバーがエラー終了している可能性があります。`server/logs/KonomiTV-Server.log` に出力されているエラーログを確認してみてください。

### Web UI にアクセスすると「Client sent an HTTP request to an HTTPS server.」と表示される

エラーメッセージの通り、`http://` でアクセスしてしまっているときに表示されます。
KonomiTV サーバーは HTTPS で起動しているため、Web UI には `https://` で始まる URL でアクセスする必要があります。

### Web UI にアクセスすると「このサイトは安全に接続できません」「～から無効な応答が送信されました。」(ERR_SSL_PROTOCOL_ERROR) と表示される

[`https://aa-bb-cc-dd.local.konomi.tv:7000/` の URL について](#httpsaa-bb-cc-ddlocalkonomitv7000-の-url-について) の項目で説明した通り、KonomiTV では過去に例のない非常に特殊な仕組みを使い、[自己署名証明書](https://wa3.i-3-i.info/word18213.html) のインストールなしで HTTPS でアクセスできるようにしています。

Web UI には `https://(IPアドレス(.を-にしたもの)).local.konomi.tv:7000/` のフォーマットの HTTPS URL (例: `https://192-168-1-11.local.konomi.tv:7000/`) でアクセスしてください。
URL が少し長いので、適宜ブックマークやホーム画面に追加しておくと便利です。

> [!NOTE]
> 上記のフォーマット以外の URL (例: `https://localhost:7000/`・`https://192.168.1.11:7000/`) では証明書や HTTPS の通信エラーが発生し、Web UI にアクセスできない仕様になっています。
> 当然ですが、プライベート IP アドレス単体では正式な証明書を取得できないためです。

### Web UI にアクセスすると、DNS エラーが表示される

お使いのルーターで DNS Rebinding Protection が有効になっている可能性があります。

KonomiTV を利用するには、DNS Rebinding Protection を無効にする必要があります。
適宜ルーターの設定を変更するか、お使いのデバイスの DNS を 1.1.1.1 や 8.8.8.8 などの公開 DNS サーバーに変更してください。

> [!NOTE]
> OpenWRT では、Rebind Protection のチェックボックスを外すと無効化できるようです。

### ライブストリーミングの視聴が安定しない・途切れ途切れになる

原因はいくつか考えられますが、回線速度が遅かったり、不安定な通信環境であることが考えられます。

#### 全般

- **KonomiTV サーバーをインストールした PC が有線 LAN に接続されていない可能性があります。**
  - **KonomiTV サーバーをインストールした PC はできるだけ有線 LAN に接続してください。** Wi-Fi 接続だけでも動作しますが、Wi-Fi 環境次第では通信が不安定になることがあります。
  - LAN 端子がないなどやむを得ず Wi-Fi 接続だけで使う場合は、PC をできるだけ Wi-Fi ルーターに近い場所に配置するなど、安定して通信できることを確認してください。
- **デバイスのスペック不足の可能性があります。**
  - KonomiTV はブラウザでリッチな視聴体験を実現していますが、その反面どうしてもネイティブアプリに比べると動作が重いです。特に **Android のローエンドや数年前の古いスマホでは、スペック不足でストリーミングが安定しないことがあります。**
  - 根本的には新しいデバイスに買い替える以外の方法はありませんが、**描画処理が重たいニコニコ実況のコメント表示や低遅延ストリーミングをオフにすると、以前より安定して再生できることが多いです。**
  - また、画質を 720p 以下に下げて視聴するのも有効です。古いスマホでは液晶の解像度が低めことも多いので、720p 以下に下げても十分視聴に耐えると思います。

#### KonomiTV サーバーのある自宅の Wi-Fi につないで視聴しているとき

- **遅い Wi-Fi アクセスポイントに接続されている可能性があります。**
  - 5GHz 帯の Wi-Fi アクセスポイント (SSID に `5G`・`A` と入っていることが多い) に接続し直してみてください。
  - 5GHz 帯の Wi-Fi アクセスポイントに対応していない古いデバイスをお持ちの方は、この機会に買い替えや 5GHz 対応の USB Wi-Fi ドングルの購入をおすすめします…。
- **Wi-Fi ルーターとの距離が離れている可能性があります。Wi-Fi ルーターに近い場所に移動するか、より近い Wi-Fi アクセスポイントに接続し直してください。**
  - Wi-Fi ルーターとの距離が離れていると、遮蔽物や減衰の影響で通信が不安定になることがあります。
  - デバイスを Wi-Fi ルーターにできるだけ近づけた状態でストリーミングが安定するなら、Wi-Fi 環境自体に問題がある可能性が高いです（電波干渉が発生している、など）。との距離が離れておらず、通信速度が十分に出ていることを確認してください。
- **低遅延ストリーミングをオフにしてみてください。**
  - 低遅延ストリーミングがオンのときは、放送波との遅延を最短 0.9 秒にまで抑えて視聴できます。ただし、回線速度が遅かったり不安定な通信環境だと、ストリーミングが安定しないことがあります。
  - 低遅延ストリーミングをオフにすると、遅延が 5 秒以上になりますが、不安定な通信環境でも安定して視聴できます。
  - 低遅延ストリーミングのオン/オフは [設定] → [全般] から変更できます。
- **ストリーミング画質を下げてみてください。**
  - デフォルトのストリーミング画質の 1080p では、平均約 10Mbps のデータ量を消費します (通信節約モードがオンなら約 3Mbps に減少する) 。データ量はシーン次第で上下しますが、一般的に動きの激しいシーンや実写ではデータ量が多くなります。
  - 画質を下げることで、回線速度が遅くても安定して視聴できるようになります。
  - スペックの低いデバイスでは、画質を下げるとストリーミングが安定することがあります。
  - デフォルトのストリーミング画質は [設定] → [全般] から変更できます。

#### 外出先 (自宅以外) から Tailscale 経由で視聴しているとき

- **低遅延ストリーミングをオフにしてみてください。**
  - 低遅延ストリーミングがオンのときは、放送波との遅延を最短 0.9 秒にまで抑えて視聴できます。ただし、**モバイルデータ通信 (4G) やフリー Wi-Fi などのネットワーク遅延の大きい不安定な通信環境では、ストリーミングが安定しないことが多いです。**
    - 海外や他の都道府県など地理的に離れた場所から視聴するときは、ネットワーク遅延が特に大きくなります。
  - **低遅延ストリーミングをオフにすると、遅延が 5 秒以上になりますが、不安定な通信環境でも比較的安定して視聴できます。**
  - 低遅延ストリーミングのオン/オフは [設定] → [全般] から変更できます。
- **ストリーミング画質を下げてみてください。**
  - デフォルトのストリーミング画質の 1080p では、平均約 10Mbps のデータ量を消費します (通信節約モードがオンなら約 3Mbps まで減る)  。データ量はシーン次第で上下しますが、一般的に動きの激しいシーンや実写ではデータ量が多くなります。
  - 場所にもよりますが、モバイルデータ通信 (4G) やフリー Wi-Fi では通信速度があまり出ないことが多いです。**画質を下げることで、回線速度が遅くても安定して視聴できるようになります。**
    - スマホの小さな画面では画質を 720p や 540p まで下げても見た目ほとんど変わらないので、そのあたりまで画質を下げるのがおすすめです。
  - **画質を下げることで、モバイルデータ通信 (4G/5G) で視聴するときのデータ通信量 (いわゆるギガ、パケ代) も抑えられます。** 360p や 240p まで下げれば、データ通信量をかなり削減できます。
    - PC サイズの画面で 360p はさすがに厳しいですが、スマホサイズの画面なら 360p でもそれなりに視聴に耐える印象です。
  - スペックの低いデバイスでは、画質を下げるとストリーミングが安定することがあります。
  - デフォルトのストリーミング画質は [設定] → [全般] から変更できます。
- **通信節約モードを有効にしてみてください。**
  - 通信節約モードでは、H.265 / HEVC という圧縮率の高いコーデックを使い、画質はほぼそのまま、通信量を**通常の 1/2 程度**に抑えながら視聴できます。
  - **外出先からモバイルデータ通信 (4G/5G) で視聴するときは常に通信節約モードをオンにしておくことをおすすめします。** 画質を保ったまま、データ通信量 (いわゆるギガ、パケ代) をかなり削減できます。
  - ただし、サーバー PC の GPU が H.265 / HEVC でのハードウェアエンコードに対応している必要があります。視聴開始時に「H.265/HEVC でのエンコードに対応していません」というエラーメッセージが表示された場合は、通信節約モードは使えません。
  - 通信節約モードのオン/オフは [設定] → [全般] から変更できます。

## 開発者向け情報

VS Code を開発に利用しています。
開発時に推奨する VS Code 拡張機能は [.vscode/extensions.json](https://github.com/tsukumijima/KonomiTV/blob/master/.vscode/extensions.json) に記述されています。

### 開発版 KonomiTV のインストール (開発環境の構築)

ここでは、master ブランチにある最新の開発版 KonomiTV を手動でインストールする方法を説明します。
サポートは行えませんので、技術的な知識がある方のみお試しください。

- Python 3.11.x
- Poetry (最新版)
- Node.js 18.17.1 (クライアントの開発やビルドを行う場合のみ)
- yarn 1.x (クライアントの開発やビルドを行う場合のみ)

事前に、上記ソフトウェアをインストールしている必要があります。

開発環境は Windows 10 (x64) と Ubuntu 20.04 LTS (x64) で動作を確認しています。
なお、開発環境の Docker での動作は想定していません。サードパーティーライブラリなどの兼ね合いで、Docker では開発時の柔軟性が低くなってしまうためです。

```bash
# Windows は PowerShell 7 で、Ubuntu は bash での実行を想定

# リポジトリの clone
## /Develop の部分は適宜変更すること
cd /Develop
git clone https://github.com/tsukumijima/KonomiTV.git

# 設定ファイルのコピーと編集
## config.yaml は適切に構成されている必要がある (さもなければサーバーが起動しない)
cd KonomiTV/
# Windows
Copy-Item -Force config.example.yaml config.yaml
# Linux:
cp -a config.example.yaml config.yaml
nano config.yaml

# 一時的な Poetry 仮想環境の構築 (UpdateThirdparty の実行に必要)
cd server/
poetry env use 3.11
poetry install --no-root

# 最新のサードパーティーライブラリを GitHub Actions からダウンロード
## 本番環境用のスタンドアローン版 Python もサードパーティーライブラリに含まれている
poetry run python -m misc.UpdateThirdparty latest

# サードパーティーライブラリ内のスタンドアローン版 Python を明示的に指定して Poetry 仮想環境を再構築
# Windows:
Remove-Item -Recurse -Force .venv/
poetry env use /Develop/KonomiTV/server/thirdparty/Python/python.exe
# Linux
rm -rf .venv/
poetry env use /Develop/KonomiTV/server/thirdparty/Python/bin/python

# 依存パッケージのインストール
poetry install --no-root
```

### サーバーの起動

KonomiTV サーバー (KonomiTV.py) を起動すると、内部で [Uvicorn](https://github.com/encode/uvicorn) と [Akebi HTTPS Server](https://github.com/tsukumijima/Akebi) が起動されます。

Uvicorn は ASGI サーバーで、FastAPI で記述された KonomiTV のアプリケーションサーバーを実行します。
また、KonomiTV の場合は `client/dist/` 以下の静的ファイル (クライアント) を配信する Web サーバーの役割も兼ねています。
Akebi HTTPS Server は、自己署名証明書なしでプライベートネットワーク上の HTTP サーバーに HTTPS 化するためのリバースプロキシサーバーです。

実際にユーザーがアクセスするのは Uvicorn の HTTP (HTTP/1.1) サーバーのリバースプロキシである、Akebi HTTPS Server による HTTPS (HTTP/2) サーバーになります。
Uvicorn も Akebi HTTPS Server も KonomiTV.py の起動時に透過的に同時起動されるため、一般のユーザーが意識する必要はありません。

```bash
cd /Develop/KonomiTV/server/

# リロードモードで起動する
poetry run task dev

# 通常モードで起動する
poetry run task serve
```

サーバーの起動方法には、リロードモードと通常モードの2つがあります。

通常モードは、本番環境 (リリース版) での Windows サービスや PM2 サービスで起動されるサーバーと同じモードになります。
より厳密にサービス起動時の環境を再現したい際は、sudo などで root 権限/管理者権限で実行してください。

リロードモードでは、`server/` 以下のコードを変更すると自動でサーバーが再起動されます。
コードが変更されると今まで起動していたサーバープロセスは強制終了され、新しいサーバープロセスが起動されます。

> [!WARNING]
> リロードモードかつ EDCB バックエンド利用時、サーバーを終了するタイミング次第では、EDCB のチューナープロセス (EpgDataCap_Bon) が終了されないままになることがあります。
> 必ずログでエンコードタスクが終了 (Offline) になったことを確認してから、サーバーを終了してください。

> [!WARNING]
> Python の asyncio の制限により、リロードモードは事実上 Windows 環境では利用できません。
> 正確には外部プロセス実行を伴うストリーミング視聴を行わなければ一応動作しますが、予期せぬ問題が発生する可能性があります。
> こうした関係もあり、現在の開発は Linux (Ubuntu 20.04 LTS) をメインに行っています。

起動したサーバーは、`https://my.local.konomi.tv:7000/` でリッスンされます。
特にリッスン範囲の制限はしていないので、プライベートネットワーク上の他の PC やスマホからもアクセスできます。
サーバーを終了するときは、Ctrl+C を押してください。

起動中のサーバーのログは、`server/logs/KonomiTV-Server.log` に保存されます。
同時起動される Akebi HTTPS Server のログは `server/logs/Akebi-HTTPS-Server.log` に保存されます。

> [!NOTE]
> サーバー設定でデバッグモード (general -> debug) を有効にすると、デバッグログも出力されるようになります。開発環境では常にデバッグモードにしておくことをおすすめします。
> さらにエンコーダーのログ (general -> debug_encoder) を有効にすると、エンコーダーのログが `server/logs/KonomiTV-Encoder-(ストリームID).log` に保存されます。

API ドキュメント (Swagger) は https://my.local.konomi.tv:7000/api/docs にあります。
API ドキュメントは FastAPI によって自動生成されたものです。
その場で API リクエストを試せたり、グラフィカルに API ドキュメントを参照できたりととても便利です。ぜひご活用ください。

### Windows / PM2 サービスのインストールと起動

ここでは、上記手順で構築した開発環境を Windows / PM2 サービスとして起動する方法を説明します。

#### Windows サービス

事前に PowerShell 7 を管理者権限で起動しておいてください。
管理者権限でない場合、Windows サービスのインストールに失敗します。

> [!WARNING]
> KonomiTV の Windows サービスは相当強引な手法で実装しているため (そうせざるを得なかった…) 、開発状況次第では Windows サービスでのみ動作しなくなっている可能性があります。
> 動作不良時は、一度 `poetry run task serve` で起動できるかや、`server/logs/KonomiTV-Server.log` 内のログを確認してみてください。

> [!NOTE]
> KonomiTV-Service.py は、KonomiTV の Windows サービスの管理を行うユーティリティスクリプトです。
> `poetry run python KonomiTV-Service.py --help` と実行すると、利用できるコマンドの一覧が表示されます。

```powershell
cd /Develop/KonomiTV/server/

# Windows サービスのインストール
## インストールと同時に自動起動 (OS 起動後数分遅延してから) も設定される
poetry run python KonomiTV-Service.py install --username (ログオン中のユーザー名) --password (ログオン中ユーザーのパスワード)

# Windows サービスの起動
## sc start "KonomiTV Service" でも起動できる
poetry run python KonomiTV-Service.py start

# Windows サービスの停止
## sc stop "KonomiTV Service" でも停止できる
poetry run python KonomiTV-Service.py stop

# Windows サービスのアンインストール
## アンインストールと同時に自動起動の設定も解除される
poetry run python KonomiTV-Service.py stop  # サービスを停止してからアンインストールすること
poetry run python KonomiTV-Service.py uninstall
```

#### PM2 サービス

事前に root 権限で PM2 がインストールされている必要があります。

```bash
cd /Develop/KonomiTV/server/

# PM2 サービスのインストール
sudo pm2 start .venv/bin/python --name KonomiTV -- KonomiTV.py

# PM2 のスタートアップ設定
sudo pm2 startup

# PM2 への変更の保存
sudo pm2 save

# PM2 サービスの起動
sudo pm2 start KonomiTV

# PM2 サービスの停止
sudo pm2 stop KonomiTV

# PM2 サービスのアンインストール
sudo pm2 stop KonomiTV  # サービスを停止してからアンインストールすること
sudo pm2 delete KonomiTV
sudo pm2 save
```

### クライアントの開発・ビルド

クライアント (フロントエンド) は Vue.js 2.x の SPA (Single Page Application) で開発されており、コーディングとビルドには少なくとも Node.js が必要です。
Node.js 18.17.1 / yarn 1.x で開発しています。

> [!WARNING]
> 情報がほとんどなく詳細不明ですが、Node.js 18.18.0 以降ではどういう訳か `vue-cli-service build` がハングアップし、クライアントのビルド時にフリーズしてしまう問題があります。
> 開発者側で直接対応可能な問題ではないので、当面の間 Node.js のバージョンを 18.17.1 に固定しています。

```bash
cd /Develop/KonomiTV/client/

# 依存パッケージのインストール
yarn install

# クライアントの開発サーバーの起動
yarn dev

# クライアントのビルド
## ビルド成果物は client/dist/ に出力され、サーバー側の HTTP サーバーによって配信される
yarn build
```

起動したクライアントの開発サーバーは、`https://my.local.konomi.tv:7001/` でリッスンされます。
`client/` 以下のコードを変更すると、自動で差分が再ビルドされます。
特にリッスン範囲の制限はしていないので、プライベートネットワーク上の他の PC やスマホからもアクセスできます。
サーバーを終了するときは、Ctrl+C を押してください。

> [!WARNING]
> `yarn dev` でクライアントの開発サーバーを起動する際は、必ず `poetry run task dev` でサーバー側の開発サーバーも起動してください。
> クライアントの開発サーバーはフロントエンド側の静的ファイルのみをホスティングしますが、サーバー側の開発サーバーは静的ファイルの配信だけでなく、API サーバーとしての役割も兼ねています。
> このため、クライアントの開発サーバーのみ、クライアントからのサーバー API のアクセス先を `https://(サーバーと同じIPアドレス).local.konomi.tv:7000/` に固定しています。

クライアントの静的ファイルは、`client/dist/` に配置されているビルド済みの成果物を、サーバー側で配信するように構成されています。
そのため、`yarn build` でクライアントのビルドを更新したのなら、サーバー側で配信される静的ファイルも同時に更新されることになります。

## 寄付・支援について

とてもありがたいことに私に寄付したいという方が複数いらっしゃったので、**今のところ [アマギフ (Amazon ギフト券)](https://www.amazon.co.jp/b?node=3131877051&tag=tsukumijima-22) だけ受けつけています。**

特典などは今のところありませんが、それでも寄付していただけるのであれば、アマギフの URL を [Twitter の DM (クリックすると DM が開きます)](https://twitter.com/messages/compose?recipient_id=1194724304585248769) か `tvremoteplusあっとgmail.com` まで送っていただけると、大変開発の励みになります…🙏🙏🙏

> [!NOTE]
> アマギフを送っていただく際に KonomiTV に実装してほしい機能を添えていただければ、もしかするとその機能を優先して実装することがある…かもしれません。
> ただし、私個人のプライベートやモチベーション、技術的な難易度などの兼ね合いもあるため、『必ず実装する』とお約束することはできません。あくまで私からのちょっとしたお礼レベルなので、基本期待しないでいただけると…。

また、一応 **[Amazon のほしい物リスト](https://www.amazon.co.jp/hz/wishlist/ls/3AZ4RI13SW2PV) もあります。** どのようなものでも贈っていただけると泣いて喜びます…。

このほか、**[こちら](https://www.amazon.co.jp/?tag=tsukumijima-22) のリンクをクリックしてから Amazon で何かお買い物していただくことでも支援できます (Amazon アソシエイト)。**
買う商品はどのようなものでも OK ですが、より [紹介料率 (商品価格のうち、何%がアソシエイト参加者に入るかの割合)](https://affiliate.amazon.co.jp/help/node/topic/GRXPHT8U84RAYDXZ) が高く、価格が高い商品の方が、私に入る報酬は高くなります。Kindle の電子書籍や食べ物・飲み物は紹介料率が高めに設定されているみたいです。

> [!NOTE]
> もしかすると GitHub から Amazon に飛ぶと[リファラ](https://wa3.i-3-i.info/word129.html)チェックで弾かれてしまうかもしれないので、リンクをコピペして新しく開いたタブに貼り付ける方が良いかもしれません。

## Special Thanks

- [xtne6f](https://github.com/xtne6f) さん： KonomiTV と EDCB を連携させるための実装や、[tsreadex](https://github.com/xtne6f/tsreadex) の実装の依頼・開発などで多大なご協力をいただきました。
- [rigaya](https://github.com/rigaya) さん： [QSVEncC](https://github.com/rigaya/QSVEnc)・[NVEncC](https://github.com/rigaya/NVEnc)・[VCEEncC](https://github.com/rigaya/VCEEnc) での動作オプションや不具合の対応、低遅延化改良、エンコードパラメーターのアドバイスなどを支援していただきました。また、[rkmppenc](https://github.com/rigaya/rkmppenc) の開発では多岐に渡り多大なご協力をいただきました。
- [xqq](https://github.com/xqq) さん： [mpegts.js](https://github.com/xqq/mpegts.js) で MPEG-TS をダイレクトストリーミングできるようになり、わずか最短 0.9 秒の低遅延でテレビを視聴することができるようになりました。mpegts.js のヘルプやプレイヤーへの導入のサポートなども支援していただきました。
- [monyone](https://github.com/monyone) さん：[aribb24.js](https://github.com/monyone/aribb24.js) のおかげで、ARIB 字幕や文字スーパーを完璧に表示できるようになりました。また、字幕関連のほか、iPhone 向けの [LL-HLS ライブストリーミングの実装](https://github.com/monyone/biim) やトラブルシューティング、導入のサポートなどで多大なご協力をいただきました。

KonomiTV の開発にあたり、ほかにも沢山の方からサポートやフィードバック、ご支援をいただきました。
この場をお借りして厚く感謝を申し上げます。 本当にありがとうございました！

## License

[MIT License](License.txt)