Initial commit: Jellyfin Black Bar Remover MVP
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using MediaBrowser.Controller.Plugins;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using MediaBrowser.Common.Configuration;
|
||||
|
||||
using Microsoft.Extensions.Hosting;
|
||||
|
||||
namespace JellyfinPlugin
|
||||
{
|
||||
public class WrapperGenerator : IHostedService
|
||||
{
|
||||
private readonly ILogger<WrapperGenerator> _logger;
|
||||
private readonly IApplicationPaths _appPaths;
|
||||
|
||||
public WrapperGenerator(ILogger<WrapperGenerator> logger, IApplicationPaths appPaths)
|
||||
{
|
||||
_logger = logger;
|
||||
_appPaths = appPaths;
|
||||
}
|
||||
|
||||
public Task StartAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
GenerateWrapper();
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task StopAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
private void GenerateWrapper()
|
||||
{
|
||||
try
|
||||
{
|
||||
string wrapperDir = Path.Combine(_appPaths.PluginsPath, "BlackBarRemover");
|
||||
Directory.CreateDirectory(wrapperDir);
|
||||
string wrapperPath = Path.Combine(wrapperDir, "ffmpeg-wrapper.sh");
|
||||
|
||||
string script = @"#!/bin/bash
|
||||
# Zmienna przechowująca ścieżkę do prawdziwego FFmpeg Jellyfina (zmień jeśli trzeba)
|
||||
REAL_FFMPEG=""/usr/lib/jellyfin-ffmpeg/ffmpeg""
|
||||
|
||||
# Znajdujemy ścieżkę pliku wejściowego (argument po -i)
|
||||
INPUT_FILE=""""
|
||||
for i in ""${!@}""; do
|
||||
if [[ ""${@:$i:1}"" == ""-i"" ]]; then
|
||||
INPUT_FILE=""${@:$i+1:1}""
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# Pobieramy crop z API naszej wtyczki
|
||||
if [ -n ""$INPUT_FILE"" ]; then
|
||||
# Jellyfin lokalnie słucha na 8096, odpytujemy API o crop
|
||||
CROP_DATA=$(curl -s --max-time 1 -G --data-urlencode ""Path=$INPUT_FILE"" http://127.0.0.1:8096/BlackBarRemover/CropByPath)
|
||||
|
||||
if [ -n ""$CROP_DATA"" ] && [ ""$CROP_DATA"" != """" ]; then
|
||||
# Znaleziono crop! Wstrzykujemy filtr crop=W:H:X:Y do argumentów
|
||||
# Dodajemy -vf crop przed argumentami wyjścia
|
||||
NEW_ARGS=()
|
||||
for arg in ""$@""; do
|
||||
# Prosta iniekcja, w realnym środowisku szukamy gdzie wkleić -vf, zazwyczaj przed plikiem wyjściowym.
|
||||
# Jellyfin sprzętowy tworzy filtry z -filter_complex, w softwareowym z -vf.
|
||||
NEW_ARGS+=(""$arg"")
|
||||
done
|
||||
|
||||
# Uruchamiamy ffmpeg z crop
|
||||
# UWAGA: to jest uproszczenie. Prawdziwy wrapper IntroSkipper musi łączyć filtry.
|
||||
# W tym MVP dodajemy prosty filter:
|
||||
exec ""$REAL_FFMPEG"" ""$@"" -vf ""crop=$CROP_DATA""
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Zwykłe uruchomienie bez crop
|
||||
exec ""$REAL_FFMPEG"" ""$@""
|
||||
";
|
||||
File.WriteAllText(wrapperPath, script);
|
||||
|
||||
// Nadajemy uprawnienia do wykonywania w systemach Linux (używając shella)
|
||||
if (Environment.OSVersion.Platform == PlatformID.Unix)
|
||||
{
|
||||
System.Diagnostics.Process.Start("chmod", $"+x \"{wrapperPath}\"");
|
||||
}
|
||||
|
||||
_logger.LogInformation("Wygenerowano skrypt FFmpeg Wrapper w lokalizacji: {Path}", wrapperPath);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Błąd podczas generowania skryptu FFmpeg wrapper.");
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user