Дополнение: Добавлена документация и примеры использования фреймворка приложений DFWebOS
- Переведен файл README.md на русский язык и дополнен подробными инструкциями по упаковке и тестированию приложений для DFWebOS. - Создан файл lint-apps.yml для GitHub Actions для проверки приложений в запросах на слияние. - Обновлен файл .gitignore для добавления дополнительных временных и сборочных файлов. - Добавлены файлы .gitkeep для поддержания структуры каталогов конфигурационных данных в Emby и Jellyfin. - Создан файл dfwebos-app.yml для Emby с подробными метаданными и описанием. - Добавлен файл docker-compose.yml для конфигурации сервиса Emby. - Создан файл dfwebos-app.yml для Jellyfin с исчерпывающими сведениями о приложении. - Добавлен файл docker-compose.yml для конфигурации сервиса Jellyfin. - Реализован хук pre-start для Jellyfin для безопасной обработки миграций версий. Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
manifestVersion: 1.1
|
||||
id: jellyfin
|
||||
category: media
|
||||
name: Jellyfin
|
||||
version: "10.11.8"
|
||||
tagline: Медиасистема свободного программного обеспечения
|
||||
description: >-
|
||||
Jellyfin — это медиа-решение, созданное добровольцами, которое позволяет вам контролировать свои медиа-ресурсы. Потоковая передача на любое устройство с вашего собственного сервера без каких-либо условий. Ваши медиа, ваш сервер, ваш путь.
|
||||
|
||||
|
||||
Запустите сервер Jellyfin в своей системе и получите доступ к ведущей бесплатной развлекательной системе, включая все навороты.
|
||||
|
||||
|
||||
Просматривайте свои мультимедиа через веб-браузер на вашем компьютере, из приложений на вашем Roku, Android, iOS (включая AirPlay), Android TV или устройстве Fire TV, а также через Chromecast или существующую установку Kodi.
|
||||
|
||||
|
||||
У Jellyfin нет отслеживания, домашнего телефона или центральных серверов, собирающих ваши данные. Мы верим в необходимость сохранения открытости и прозрачности нашего программного обеспечения, и все, что мы можем собирать (журналы сбоев и т. д.), осуществляется только по согласию. Мы также не занимаемся медиа-бизнесом, поэтому единственные средства массовой информации, которые вы видите, — это ваши собственные.
|
||||
|
||||
|
||||
Сервер и клиенты Jellyfin можно загрузить бесплатно сейчас и всегда. Использование Jellyfin ни для себя, ни для ваших друзей, ни для вашей компании не требует никаких затрат, скрытых или иных. Все наши непредвиденные расходы оплачиваются за счет пожертвований таких пользователей, как вы.
|
||||
developer: Jellyfin
|
||||
website: https://jellyfin.org/
|
||||
dependencies: []
|
||||
repo: https://github.com/jellyfin/jellyfin
|
||||
support: https://github.com/jellyfin/jellyfin/issues
|
||||
port: 8096
|
||||
gallery:
|
||||
- 1.jpg
|
||||
- 2.jpg
|
||||
- 3.jpg
|
||||
path: ""
|
||||
defaultUsername: ""
|
||||
defaultPassword: ""
|
||||
releaseNotes: >-
|
||||
⚠️ Это обновление включает важные исправления безопасности. Всем пользователям настоятельно рекомендуется немедленно выполнить обновление.
|
||||
|
||||
|
||||
Ключевые улучшения в этом выпуске:
|
||||
- Исправлены регрессии, появившиеся в 10.11.7.
|
||||
- Исправлено сохранение субтитров и обработка языка загрузки субтитров из библиотеки.
|
||||
- Исправлен запрос мультимедиа с языковыми фильтрами.
|
||||
- Улучшена стабильность и производительность системы.
|
||||
|
||||
|
||||
Полные примечания к выпуску можно найти по адресу https://github.com/jellyfin/jellyfin/releases.
|
||||
torOnly: false
|
||||
permissions:
|
||||
- STORAGE_DOWNLOADS
|
||||
- GPU
|
||||
submitter: DFWebOS
|
||||
submission: https://github.dfv24.com/fofanov.dmitry/DFWebOS-Apps/pulls
|
||||
@@ -0,0 +1,22 @@
|
||||
version: "3.7"
|
||||
|
||||
services:
|
||||
app_proxy:
|
||||
environment:
|
||||
APP_HOST: jellyfin_server_1
|
||||
APP_PORT: 8096
|
||||
PROXY_AUTH_ADD: "false"
|
||||
|
||||
server:
|
||||
image: linuxserver/jellyfin:10.11.8@sha256:e93bc100c6da07bd058678e4b634e4e71031fe840227e2ed03a1104f032bebe8
|
||||
restart: on-failure
|
||||
hostname: "${DEVICE_HOSTNAME}"
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/config:/config
|
||||
- ${DFWEBOS_ROOT}/data/storage/downloads:/downloads
|
||||
ports:
|
||||
# Автообнаружение службы
|
||||
- 7359:7359/udp
|
||||
Executable
+152
@@ -0,0 +1,152 @@
|
||||
#!/usr/bin/env bash
|
||||
# Этот сценарий обрабатывает миграцию версий Jellyfin, чтобы обеспечить безопасное обновление через необходимые промежуточные версии.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
APP_DIR="$(readlink -f $(dirname "${BASH_SOURCE[0]}")/..)"
|
||||
APP_DATA_DIR="${APP_DIR}/data"
|
||||
APP_COMPOSE_FILE="${APP_DIR}/docker-compose.yml"
|
||||
JELLYFIN_SYSTEM_FILE="${APP_DATA_DIR}/config/system.xml"
|
||||
JELLYFIN_UPDATE_FLAG_FILE="${APP_DATA_DIR}/POST_1_10_VERSION"
|
||||
MIGRATION_IN_PROGRESS_FILE="${APP_DATA_DIR}/MIGRATION_IN_PROGRESS"
|
||||
MIGRATION_FIX_FLAG="${APP_DATA_DIR}/MIGRATION_20250618_FIXED"
|
||||
|
||||
# Если файлы базы данных еще не существуют
|
||||
# Тогда скорее всего это новая установка
|
||||
# Создайте файл флага, чтобы указать, что это версия 1.10+.
|
||||
if [[ ! -f "${JELLYFIN_SYSTEM_FILE}" ]]; then
|
||||
touch "${JELLYFIN_UPDATE_FLAG_FILE}"
|
||||
touch "${MIGRATION_FIX_FLAG}"
|
||||
fi
|
||||
|
||||
# Выйти, если файл флага существует
|
||||
if [[ -f "${JELLYFIN_UPDATE_FLAG_FILE}" ]]; then
|
||||
echo "Jellyfin update flag file already exists at ${JELLYFIN_UPDATE_FLAG_FILE}. Skipping migration steps."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Проверьте, выполняется ли уже миграция, чтобы предотвратить бесконечные циклы.
|
||||
if [[ -f "${MIGRATION_IN_PROGRESS_FILE}" ]]; then
|
||||
echo "Migration already in progress, exiting to prevent loops"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Отметить миграцию как выполняемую
|
||||
touch "${MIGRATION_IN_PROGRESS_FILE}"
|
||||
|
||||
# Функция очистки ловушки
|
||||
cleanup() {
|
||||
local exit_code=$?
|
||||
if [[ $exit_code -ne 0 ]]; then
|
||||
echo "Migration failed, cleaning up..."
|
||||
# Восстановить исходный файл компоновки, если у нас есть исходное изображение.
|
||||
if [[ -n "${original_server_image:-}" ]]; then
|
||||
yq -i ".services.server.image = \"${original_server_image}\"" "${APP_COMPOSE_FILE}" 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
rm -f "${MIGRATION_IN_PROGRESS_FILE}"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
# Если файл флага не существует, сначала обновите его до версии 1.10.7, а затем перейдите к последней версии.
|
||||
echo "No POST_1_10_VERSION flag found - performing update to v1.10.7 and then to latest version"
|
||||
|
||||
# Образы Docker для промежуточного шага v1.10.7
|
||||
INTERMEDIATE_SERVER_IMAGE="linuxserver/jellyfin:10.10.7@sha256:01c9d2311eb7710867fb3a8c2718068a276cff468a71d2a2dc58a0f5165ad0d2"
|
||||
|
||||
# Получить текущие изображения с docker-compose.yml
|
||||
get_current_images_from_compose() {
|
||||
local server_image=$(yq '.services.server.image' "${APP_COMPOSE_FILE}" 2>/dev/null || echo "")
|
||||
echo "${server_image}"
|
||||
}
|
||||
|
||||
# Обновить файл компоновки новыми изображениями.
|
||||
update_compose_images() {
|
||||
local server_image="${1}"
|
||||
|
||||
yq -i ".services.server.image = \"${server_image}\"" "${APP_COMPOSE_FILE}"
|
||||
}
|
||||
|
||||
# Сохраните исходное изображение для последнего шага.
|
||||
original_server_image=$(get_current_images_from_compose)
|
||||
|
||||
echo "Step 1: Updating to v1.10.7 for safe migration"
|
||||
update_compose_images "${INTERMEDIATE_SERVER_IMAGE}"
|
||||
|
||||
# Начните с версии 1.10.7
|
||||
echo "Starting Jellyfin v1.10.7..."
|
||||
"${DFWEBOS_ROOT}/scripts/app" start jellyfin
|
||||
|
||||
# Дождитесь завершения запуска и миграции.
|
||||
echo "Waiting for v1.10.7 to complete startup and migrations..."
|
||||
|
||||
# Конечная точка опроса работоспособности с тайм-аутом
|
||||
MAX_WAIT=300
|
||||
POLL_INTERVAL=5
|
||||
elapsed=0
|
||||
|
||||
while [[ $elapsed -lt $MAX_WAIT ]]; do
|
||||
if curl -sf "http://localhost:8096/health" > /dev/null 2>&1; then
|
||||
echo "Jellyfin v1.10.7 is healthy after ${elapsed}s"
|
||||
# Дайте дополнительное время для завершения оставшихся миграций.
|
||||
sleep 10
|
||||
break
|
||||
fi
|
||||
sleep $POLL_INTERVAL
|
||||
elapsed=$((elapsed + POLL_INTERVAL))
|
||||
done
|
||||
|
||||
if [[ $elapsed -ge $MAX_WAIT ]]; then
|
||||
echo "Warning: Jellyfin health check timed out after ${MAX_WAIT}s, proceeding anyway"
|
||||
fi
|
||||
|
||||
# Остановить приложение
|
||||
echo "Stopping Jellyfin v1.10.7..."
|
||||
"${DFWEBOS_ROOT}/scripts/app" stop jellyfin
|
||||
|
||||
# Примените исправление таблицы UserDatas к library.db BEFORE. Запускается версия 10.11.5.
|
||||
# При миграции MigrateLibraryDb в версии 10.11.5 library.db будет переименован в library.db.old.
|
||||
# Тогда MigrateLibraryUserData попытается прочитать UserDatas из library.db.old.
|
||||
# Поэтому мы добавляем таблицу в library.db сейчас, прежде чем она будет переименована.
|
||||
LIBRARY_DB="${APP_DATA_DIR}/config/data/data/library.db"
|
||||
if [[ -f "${LIBRARY_DB}" && ! -f "${MIGRATION_FIX_FLAG}" ]]; then
|
||||
echo "Applying UserDatas table fix to library.db (before 10.11.5 renames it)..."
|
||||
|
||||
if python3 -c "
|
||||
import sqlite3
|
||||
conn = sqlite3.connect('${LIBRARY_DB}')
|
||||
cursor = conn.cursor()
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS UserDatas (
|
||||
key TEXT NOT NULL,
|
||||
userId TEXT NOT NULL,
|
||||
rating REAL,
|
||||
played INTEGER NOT NULL,
|
||||
playCount INTEGER NOT NULL,
|
||||
isFavorite INTEGER NOT NULL,
|
||||
playbackPositionTicks INTEGER NOT NULL,
|
||||
lastPlayedDate TEXT,
|
||||
AudioStreamIndex INTEGER,
|
||||
SubtitleStreamIndex INTEGER,
|
||||
PRIMARY KEY (key, userId)
|
||||
)
|
||||
''')
|
||||
conn.commit()
|
||||
conn.close()
|
||||
"; then
|
||||
echo "UserDatas table fix applied successfully"
|
||||
touch "${MIGRATION_FIX_FLAG}"
|
||||
else
|
||||
echo "Failed to apply UserDatas table fix"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Step 2: Updating to latest version"
|
||||
update_compose_images "${original_server_image}"
|
||||
|
||||
# Создайте файл флага, чтобы предотвратить повторный запуск этой миграции.
|
||||
touch "${JELLYFIN_UPDATE_FLAG_FILE}"
|
||||
|
||||
echo "Migration completed: v1.10.7 -> latest version"
|
||||
echo "Created ${JELLYFIN_UPDATE_FLAG_FILE} flag file"
|
||||
Reference in New Issue
Block a user