repo creation with initial code after cloning public repo
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
using System;
|
||||
using MediaBrowser.MediaEncoding.Encoder;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.MediaEncoding.Tests
|
||||
{
|
||||
public class EncoderValidatorTests
|
||||
{
|
||||
private readonly EncoderValidator _encoderValidator = new EncoderValidator(new NullLogger<EncoderValidatorTests>(), "ffmpeg");
|
||||
|
||||
[Theory]
|
||||
[ClassData(typeof(GetFFmpegVersionTestData))]
|
||||
public void GetFFmpegVersionTest(string versionOutput, Version? version)
|
||||
{
|
||||
Assert.Equal(version, _encoderValidator.GetFFmpegVersionInternal(versionOutput));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(EncoderValidatorTestsData.FFmpegV701Output, true)]
|
||||
[InlineData(EncoderValidatorTestsData.FFmpegV611Output, true)]
|
||||
[InlineData(EncoderValidatorTestsData.FFmpegV60Output, true)]
|
||||
[InlineData(EncoderValidatorTestsData.FFmpegV512Output, true)]
|
||||
[InlineData(EncoderValidatorTestsData.FFmpegV44Output, true)]
|
||||
[InlineData(EncoderValidatorTestsData.FFmpegV432Output, false)]
|
||||
[InlineData(EncoderValidatorTestsData.FFmpegGitUnknownOutput2, true)]
|
||||
[InlineData(EncoderValidatorTestsData.FFmpegGitUnknownOutput, false)]
|
||||
public void ValidateVersionInternalTest(string versionOutput, bool valid)
|
||||
{
|
||||
Assert.Equal(valid, _encoderValidator.ValidateVersionInternal(versionOutput));
|
||||
}
|
||||
|
||||
private sealed class GetFFmpegVersionTestData : TheoryData<string, Version?>
|
||||
{
|
||||
public GetFFmpegVersionTestData()
|
||||
{
|
||||
Add(EncoderValidatorTestsData.FFmpegV701Output, new Version(7, 0, 1));
|
||||
Add(EncoderValidatorTestsData.FFmpegV611Output, new Version(6, 1, 1));
|
||||
Add(EncoderValidatorTestsData.FFmpegV60Output, new Version(6, 0));
|
||||
Add(EncoderValidatorTestsData.FFmpegV512Output, new Version(5, 1, 2));
|
||||
Add(EncoderValidatorTestsData.FFmpegV44Output, new Version(4, 4));
|
||||
Add(EncoderValidatorTestsData.FFmpegV432Output, new Version(4, 3, 2));
|
||||
Add(EncoderValidatorTestsData.FFmpegGitUnknownOutput2, new Version(4, 4));
|
||||
Add(EncoderValidatorTestsData.FFmpegGitUnknownOutput, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
namespace Jellyfin.MediaEncoding.Tests
|
||||
{
|
||||
internal static class EncoderValidatorTestsData
|
||||
{
|
||||
public const string FFmpegV701Output = @"ffmpeg version 7.0.1-Jellyfin Copyright (c) 2000-2024 the FFmpeg developers
|
||||
built with clang version 18.1.8
|
||||
configuration: --cc=clang --pkg-config-flags=--static --extra-cflags=-I/clang64/ffbuild/include --extra-ldflags=-L/clang64/ffbuild/lib --prefix=/clang64/ffbuild/jellyfin-ffmpeg --extra-version=Jellyfin --disable-ffplay --disable-debug --disable-doc --disable-sdl2 --disable-ptx-compression --enable-lto=thin --enable-gpl --enable-version3 --enable-schannel --enable-iconv --enable-libxml2 --enable-zlib --enable-lzma --enable-gmp --enable-chromaprint --enable-libfreetype --enable-libfribidi --enable-libfontconfig --enable-libharfbuzz --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libopenmpt --enable-libwebp --enable-libvpx --enable-libzimg --enable-libx264 --enable-libx265 --enable-libsvtav1 --enable-libdav1d --enable-libfdk-aac --enable-opencl --enable-dxva2 --enable-d3d11va --enable-amf --enable-libvpl --enable-ffnvcodec --enable-cuda --enable-cuda-llvm --enable-cuvid --enable-nvdec --enable-nvenc
|
||||
libavutil 59. 8.100 / 59. 8.100
|
||||
libavcodec 61. 3.100 / 61. 3.100
|
||||
libavformat 61. 1.100 / 61. 1.100
|
||||
libavdevice 61. 1.100 / 61. 1.100
|
||||
libavfilter 10. 1.100 / 10. 1.100
|
||||
libswscale 8. 1.100 / 8. 1.100
|
||||
libswresample 5. 1.100 / 5. 1.100
|
||||
libpostproc 58. 1.100 / 58. 1.100";
|
||||
|
||||
public const string FFmpegV611Output = @"ffmpeg version n6.1.1-16-g33efa50fa4-20240317 Copyright (c) 2000-2023 the FFmpeg developers
|
||||
built with gcc 13.2.0 (crosstool-NG 1.26.0.65_ecc5e41)
|
||||
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --enable-shared --disable-static --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libharfbuzz --enable-libvorbis --enable-opencl --disable-libpulse --enable-libvmaf --disable-libxcb --disable-xlib --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --enable-libvpl --enable-openal --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --enable-vaapi --enable-libvidstab --enable-vulkan --enable-libshaderc --enable-libplacebo --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags='$FF_CFLAGS' --extra-cxxflags='$FF_CXXFLAGS' --extra-ldflags='$FF_LDFLAGS' --extra-ldexeflags='$FF_LDEXEFLAGS' --extra-libs='$FF_LIBS' --extra-version=20240317
|
||||
libavutil 58. 29.100 / 58. 29.100
|
||||
libavcodec 60. 31.102 / 60. 31.102
|
||||
libavformat 60. 16.100 / 60. 16.100
|
||||
libavdevice 60. 3.100 / 60. 3.100
|
||||
libavfilter 9. 12.100 / 9. 12.100
|
||||
libswscale 7. 5.100 / 7. 5.100
|
||||
libswresample 4. 12.100 / 4. 12.100
|
||||
libpostproc 57. 3.100 / 57. 3.100";
|
||||
|
||||
public const string FFmpegV60Output = @"ffmpeg version 6.0-Jellyfin Copyright (c) 2000-2023 the FFmpeg developers
|
||||
built with gcc 12.2.0 (crosstool-NG 1.25.0.90_cf9beb1)
|
||||
configuration: --prefix=/ffbuild/prefix --pkg-config=pkg-config --pkg-config-flags=--static --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --extra-version=Jellyfin --extra-cflags= --extra-cxxflags= --extra-ldflags= --extra-ldexeflags= --extra-libs= --enable-gpl --enable-version3 --enable-lto --disable-ffplay --disable-debug --disable-doc --disable-ptx-compression --disable-sdl2 --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --enable-amf --enable-chromaprint --enable-libdav1d --enable-dxva2 --enable-d3d11va --enable-libfdk-aac --enable-ffnvcodec --enable-cuda --enable-cuda-llvm --enable-cuvid --enable-nvdec --enable-nvenc --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvpx --enable-libwebp --enable-libvpl --enable-schannel --enable-libsrt --enable-libsvtav1 --enable-vulkan --enable-libshaderc --enable-libplacebo --enable-libx264 --enable-libx265 --enable-libzimg --enable-libzvbi
|
||||
libavutil 58. 2.100 / 58. 2.100
|
||||
libavcodec 60. 3.100 / 60. 3.100
|
||||
libavformat 60. 3.100 / 60. 3.100
|
||||
libavdevice 60. 1.100 / 60. 1.100
|
||||
libavfilter 9. 3.100 / 9. 3.100
|
||||
libswscale 7. 1.100 / 7. 1.100
|
||||
libswresample 4. 10.100 / 4. 10.100
|
||||
libpostproc 57. 1.100 / 57. 1.100";
|
||||
|
||||
public const string FFmpegV512Output = @"ffmpeg version 5.1.2-Jellyfin Copyright (c) 2000-2022 the FFmpeg developers
|
||||
built with gcc 10-win32 (GCC) 20220324
|
||||
configuration: --prefix=/opt/ffmpeg --arch=x86_64 --target-os=mingw32 --cross-prefix=x86_64-w64-mingw32- --pkg-config=pkg-config --pkg-config-flags=--static --extra-libs='-lfftw3f -lstdc++' --extra-cflags=-DCHROMAPRINT_NODLL --extra-version=Jellyfin --disable-ffplay --disable-debug --disable-doc --disable-sdl2 --disable-ptx-compression --disable-w32threads --enable-pthreads --enable-shared --enable-lto --enable-gpl --enable-version3 --enable-schannel --enable-iconv --enable-libxml2 --enable-zlib --enable-lzma --enable-gmp --enable-chromaprint --enable-libfreetype --enable-libfribidi --enable-libfontconfig --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libwebp --enable-libvpx --enable-libzimg --enable-libx264 --enable-libx265 --enable-libsvtav1 --enable-libdav1d --enable-libfdk-aac --enable-opencl --enable-dxva2 --enable-d3d11va --enable-amf --enable-libmfx --enable-ffnvcodec --enable-cuda --enable-cuda-llvm --enable-cuvid --enable-nvdec --enable-nvenc
|
||||
libavutil 57. 28.100 / 57. 28.100
|
||||
libavcodec 59. 37.100 / 59. 37.100
|
||||
libavformat 59. 27.100 / 59. 27.100
|
||||
libavdevice 59. 7.100 / 59. 7.100
|
||||
libavfilter 8. 44.100 / 8. 44.100
|
||||
libswscale 6. 7.100 / 6. 7.100
|
||||
libswresample 4. 7.100 / 4. 7.100
|
||||
libpostproc 56. 6.100 / 56. 6.100";
|
||||
|
||||
public const string FFmpegV44Output = @"ffmpeg version 4.4-Jellyfin Copyright (c) 2000-2021 the FFmpeg developers
|
||||
built with gcc 10.3.0 (Rev5, Built by MSYS2 project)
|
||||
configuration: --disable-static --enable-shared --extra-version=Jellyfin --disable-ffplay --disable-debug --enable-gpl --enable-version3 --enable-bzlib --enable-iconv --enable-lzma --enable-zlib --enable-sdl2 --enable-fontconfig --enable-gmp --enable-libass --enable-libzimg --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libwebp --enable-libvpx --enable-libx264 --enable-libx265 --enable-libdav1d --enable-opencl --enable-dxva2 --enable-d3d11va --enable-amf --enable-libmfx --enable-cuda --enable-cuda-llvm --enable-cuvid --enable-nvenc --enable-nvdec --enable-ffnvcodec --enable-gnutls
|
||||
libavutil 56. 70.100 / 56. 70.100
|
||||
libavcodec 58.134.100 / 58.134.100
|
||||
libavformat 58. 76.100 / 58. 76.100
|
||||
libavdevice 58. 13.100 / 58. 13.100
|
||||
libavfilter 7.110.100 / 7.110.100
|
||||
libswscale 5. 9.100 / 5. 9.100
|
||||
libswresample 3. 9.100 / 3. 9.100
|
||||
libpostproc 55. 9.100 / 55. 9.100";
|
||||
|
||||
public const string FFmpegV432Output = @"ffmpeg version n4.3.2-Jellyfin Copyright (c) 2000-2021 the FFmpeg developers
|
||||
built with gcc 10.2.0 (Rev9, Built by MSYS2 project)
|
||||
configuration: --disable-static --enable-shared --cc='ccache gcc' --cxx='ccache g++' --extra-version=Jellyfin --disable-ffplay --disable-debug --enable-lto --enable-gpl --enable-version3 --enable-bzlib --enable-iconv --enable-lzma --enable-zlib --enable-sdl2 --enable-fontconfig --enable-gmp --enable-libass --enable-libzimg --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libwebp --enable-libvpx --enable-libx264 --enable-libx265 --enable-libdav1d --enable-opencl --enable-dxva2 --enable-d3d11va --enable-amf --enable-libmfx --enable-cuda --enable-cuda-llvm --enable-cuvid --enable-nvenc --enable-nvdec --enable-ffnvcodec --enable-gnutls
|
||||
libavutil 56. 51.100 / 56. 51.100
|
||||
libavcodec 58. 91.100 / 58. 91.100
|
||||
libavformat 58. 45.100 / 58. 45.100
|
||||
libavdevice 58. 10.100 / 58. 10.100
|
||||
libavfilter 7. 85.100 / 7. 85.100
|
||||
libswscale 5. 7.100 / 5. 7.100
|
||||
libswresample 3. 7.100 / 3. 7.100
|
||||
libpostproc 55. 7.100 / 55. 7.100";
|
||||
|
||||
public const string FFmpegGitUnknownOutput2 = @"ffmpeg version N-g01fc3034ee-20240317 Copyright (c) 2000-2023 the FFmpeg developers
|
||||
built with gcc 13.2.0 (crosstool-NG 1.26.0.65_ecc5e41)
|
||||
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --enable-shared --disable-static --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --disable-libpulse --disable-libxcb --disable-xlib --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --disable-chromaprint --enable-libdav1d --enable-libdavs2 --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --disable-frei0r --enable-libgme --enable-libkvazaar --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --disable-openal --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --disable-vaapi --enable-libvidstab --disable-vulkan --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags='$FF_CFLAGS' --extra-cxxflags='$FF_CXXFLAGS' --extra-ldflags='$FF_LDFLAGS' --extra-ldexeflags='$FF_LDEXEFLAGS' --extra-libs='$FF_LIBS' --extra-version=20240317
|
||||
libavutil 56. 70.100 / 56. 70.100
|
||||
libavcodec 58.134.100 / 58.134.100
|
||||
libavformat 58. 76.100 / 58. 76.100
|
||||
libavdevice 58. 13.100 / 58. 13.100
|
||||
libavfilter 7.110.100 / 7.110.100
|
||||
libswscale 5. 9.100 / 5. 9.100
|
||||
libswresample 3. 9.100 / 3. 9.100
|
||||
libpostproc 55. 9.100 / 55. 9.100";
|
||||
|
||||
public const string FFmpegGitUnknownOutput = @"ffmpeg version N-45325-gb173e0353-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2018 the FFmpeg developers
|
||||
built with gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
|
||||
configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg
|
||||
libavutil 56. 9.100 / 56. 9.100
|
||||
libavcodec 58. 14.100 / 58. 14.100
|
||||
libavformat 58. 10.100 / 58. 10.100
|
||||
libavdevice 58. 2.100 / 58. 2.100
|
||||
libavfilter 7. 13.100 / 7. 13.100
|
||||
libswscale 5. 0.102 / 5. 0.102
|
||||
libswresample 3. 0.101 / 3. 0.101
|
||||
libpostproc 55. 0.100 / 55. 0.100";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<!-- ProjectGuid is only included as a requirement for SonarQube analysis -->
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{28464062-0939-4AA7-9F7B-24DDDA61A7C0}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="Test Data\**\*.*">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="AutoFixture" />
|
||||
<PackageReference Include="AutoFixture.AutoMoq" />
|
||||
<PackageReference Include="AutoFixture.Xunit2" />
|
||||
<PackageReference Include="coverlet.collector" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" />
|
||||
<PackageReference Include="Moq" />
|
||||
<PackageReference Include="xunit" />
|
||||
<PackageReference Include="xunit.runner.visualstudio">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="../../MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,50 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.MediaEncoding.Encoder;
|
||||
using MediaBrowser.Model.Globalization;
|
||||
using MediaBrowser.Model.IO;
|
||||
using MediaBrowser.Model.MediaInfo;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Moq;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.MediaEncoding.Tests.Probing
|
||||
{
|
||||
public class ProbeExternalSourcesTests
|
||||
{
|
||||
[Fact]
|
||||
public void GetExtraArguments_Forwards_UserAgent()
|
||||
{
|
||||
var encoder = new MediaEncoder(
|
||||
Mock.Of<ILogger<MediaEncoder>>(),
|
||||
Mock.Of<IServerConfigurationManager>(),
|
||||
Mock.Of<IFileSystem>(),
|
||||
Mock.Of<IBlurayExaminer>(),
|
||||
Mock.Of<ILocalizationManager>(),
|
||||
new ConfigurationBuilder().Build(),
|
||||
Mock.Of<IServerConfigurationManager>());
|
||||
|
||||
var userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)";
|
||||
var req = new MediaBrowser.Controller.MediaEncoding.MediaInfoRequest()
|
||||
{
|
||||
MediaSource = new MediaBrowser.Model.Dto.MediaSourceInfo
|
||||
{
|
||||
Path = "/path/to/stream",
|
||||
Protocol = MediaProtocol.Http,
|
||||
RequiredHttpHeaders = new Dictionary<string, string>()
|
||||
{
|
||||
{ "User-Agent", userAgent },
|
||||
}
|
||||
},
|
||||
ExtractChapters = false,
|
||||
MediaType = MediaBrowser.Model.Dlna.DlnaProfileType.Video,
|
||||
};
|
||||
|
||||
var extraArg = encoder.GetExtraArguments(req);
|
||||
|
||||
Assert.Contains($"-user_agent \"{userAgent}\"", extraArg, StringComparison.InvariantCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,407 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
using Jellyfin.Data.Enums;
|
||||
using Jellyfin.Extensions.Json;
|
||||
using Jellyfin.Extensions.Json.Converters;
|
||||
using MediaBrowser.MediaEncoding.Probing;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Globalization;
|
||||
using MediaBrowser.Model.MediaInfo;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using Moq;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.MediaEncoding.Tests.Probing
|
||||
{
|
||||
public class ProbeResultNormalizerTests
|
||||
{
|
||||
private readonly JsonSerializerOptions _jsonOptions;
|
||||
private readonly ProbeResultNormalizer _probeResultNormalizer = new ProbeResultNormalizer(new NullLogger<EncoderValidatorTests>(), new Mock<ILocalizationManager>().Object);
|
||||
|
||||
public ProbeResultNormalizerTests()
|
||||
{
|
||||
_jsonOptions = new JsonSerializerOptions(JsonDefaults.Options);
|
||||
_jsonOptions.Converters.Add(new JsonBoolStringConverter());
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("2997/125", 23.976f)]
|
||||
[InlineData("1/50", 0.02f)]
|
||||
[InlineData("25/1", 25f)]
|
||||
[InlineData("120/1", 120f)]
|
||||
[InlineData("1704753000/71073479", 23.98578237601117f)]
|
||||
[InlineData("0/0", null)]
|
||||
[InlineData("1/1000", 0.001f)]
|
||||
[InlineData("1/90000", 1.1111111E-05f)]
|
||||
[InlineData("1/48000", 2.0833333E-05f)]
|
||||
public void GetFrameRate_Success(string value, float? expected)
|
||||
=> Assert.Equal(expected, ProbeResultNormalizer.GetFrameRate(value));
|
||||
|
||||
[Fact]
|
||||
public void GetMediaInfo_MetaData_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/Probing/video_metadata.json");
|
||||
var internalMediaInfoResult = JsonSerializer.Deserialize<InternalMediaInfoResult>(bytes, _jsonOptions);
|
||||
MediaInfo res = _probeResultNormalizer.GetMediaInfo(internalMediaInfoResult, VideoType.VideoFile, false, "Test Data/Probing/video_metadata.mkv", MediaProtocol.File);
|
||||
|
||||
Assert.Equal("mkv", res.Container);
|
||||
|
||||
Assert.Equal(3, res.MediaStreams.Count);
|
||||
|
||||
Assert.NotNull(res.VideoStream);
|
||||
Assert.Equal("4:3", res.VideoStream.AspectRatio);
|
||||
Assert.Equal(25f, res.VideoStream.AverageFrameRate);
|
||||
Assert.Equal(8, res.VideoStream.BitDepth);
|
||||
Assert.Equal(69432, res.VideoStream.BitRate);
|
||||
Assert.Equal("h264", res.VideoStream.Codec);
|
||||
Assert.Equal("1/50", res.VideoStream.CodecTimeBase);
|
||||
Assert.Equal(240, res.VideoStream.Height);
|
||||
Assert.Equal(320, res.VideoStream.Width);
|
||||
Assert.Equal(0, res.VideoStream.Index);
|
||||
Assert.False(res.VideoStream.IsAnamorphic);
|
||||
Assert.True(res.VideoStream.IsAVC);
|
||||
Assert.True(res.VideoStream.IsDefault);
|
||||
Assert.False(res.VideoStream.IsExternal);
|
||||
Assert.False(res.VideoStream.IsForced);
|
||||
Assert.False(res.VideoStream.IsHearingImpaired);
|
||||
Assert.False(res.VideoStream.IsInterlaced);
|
||||
Assert.False(res.VideoStream.IsTextSubtitleStream);
|
||||
Assert.Equal(13d, res.VideoStream.Level);
|
||||
Assert.Equal("4", res.VideoStream.NalLengthSize);
|
||||
Assert.Equal("yuv444p", res.VideoStream.PixelFormat);
|
||||
Assert.Equal("High 4:4:4 Predictive", res.VideoStream.Profile);
|
||||
Assert.Equal(25f, res.VideoStream.RealFrameRate);
|
||||
Assert.Equal(1, res.VideoStream.RefFrames);
|
||||
Assert.Equal("1/1000", res.VideoStream.TimeBase);
|
||||
Assert.Equal(MediaStreamType.Video, res.VideoStream.Type);
|
||||
Assert.Equal(1, res.VideoStream.DvVersionMajor);
|
||||
Assert.Equal(0, res.VideoStream.DvVersionMinor);
|
||||
Assert.Equal(5, res.VideoStream.DvProfile);
|
||||
Assert.Equal(6, res.VideoStream.DvLevel);
|
||||
Assert.Equal(1, res.VideoStream.RpuPresentFlag);
|
||||
Assert.Equal(0, res.VideoStream.ElPresentFlag);
|
||||
Assert.Equal(1, res.VideoStream.BlPresentFlag);
|
||||
Assert.Equal(0, res.VideoStream.DvBlSignalCompatibilityId);
|
||||
Assert.Equal(-180, res.VideoStream.Rotation);
|
||||
|
||||
var audio1 = res.MediaStreams[1];
|
||||
Assert.Equal("eac3", audio1.Codec);
|
||||
Assert.Equal(AudioSpatialFormat.DolbyAtmos, audio1.AudioSpatialFormat);
|
||||
|
||||
var audio2 = res.MediaStreams[2];
|
||||
Assert.Equal("dts", audio2.Codec);
|
||||
Assert.Equal(AudioSpatialFormat.DTSX, audio2.AudioSpatialFormat);
|
||||
|
||||
Assert.Empty(res.Chapters);
|
||||
Assert.Equal("Just color bars", res.Overview);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetMediaInfo_Mp4MetaData_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/Probing/video_mp4_metadata.json");
|
||||
var internalMediaInfoResult = JsonSerializer.Deserialize<InternalMediaInfoResult>(bytes, _jsonOptions);
|
||||
|
||||
// subtitle handling requires a localization object, set a mock to return the input string
|
||||
var mockLocalization = new Mock<ILocalizationManager>();
|
||||
mockLocalization.Setup(x => x.GetLocalizedString(It.IsAny<string>())).Returns<string>(x => x);
|
||||
ProbeResultNormalizer localizedProbeResultNormalizer = new ProbeResultNormalizer(new NullLogger<EncoderValidatorTests>(), mockLocalization.Object);
|
||||
|
||||
MediaInfo res = localizedProbeResultNormalizer.GetMediaInfo(internalMediaInfoResult, VideoType.VideoFile, false, "Test Data/Probing/video_mp4_metadata.mkv", MediaProtocol.File);
|
||||
|
||||
// [Video, Audio (Main), Audio (Commentary), Subtitle (Main, Spanish), Subtitle (Main, English), Subtitle (Commentary)
|
||||
Assert.Equal(6, res.MediaStreams.Count);
|
||||
|
||||
Assert.NotNull(res.VideoStream);
|
||||
Assert.Equal(res.MediaStreams[0], res.VideoStream);
|
||||
Assert.Equal(0, res.VideoStream.Index);
|
||||
Assert.Equal("h264", res.VideoStream.Codec);
|
||||
Assert.Equal("High", res.VideoStream.Profile);
|
||||
Assert.Equal(MediaStreamType.Video, res.VideoStream.Type);
|
||||
Assert.Equal(358, res.VideoStream.Height);
|
||||
Assert.Equal(720, res.VideoStream.Width);
|
||||
Assert.Equal("2.40:1", res.VideoStream.AspectRatio);
|
||||
Assert.Equal("yuv420p", res.VideoStream.PixelFormat);
|
||||
Assert.Equal(31d, res.VideoStream.Level);
|
||||
Assert.Equal(1, res.VideoStream.RefFrames);
|
||||
Assert.True(res.VideoStream.IsAVC);
|
||||
Assert.Equal(120f, res.VideoStream.RealFrameRate);
|
||||
Assert.Equal("1/90000", res.VideoStream.TimeBase);
|
||||
Assert.Equal(1147365, res.VideoStream.BitRate);
|
||||
Assert.Equal(8, res.VideoStream.BitDepth);
|
||||
Assert.True(res.VideoStream.IsDefault);
|
||||
Assert.Equal("und", res.VideoStream.Language);
|
||||
|
||||
Assert.Equal(MediaStreamType.Audio, res.MediaStreams[1].Type);
|
||||
Assert.Equal("aac", res.MediaStreams[1].Codec);
|
||||
Assert.Equal(7, res.MediaStreams[1].Channels);
|
||||
Assert.True(res.MediaStreams[1].IsDefault);
|
||||
Assert.Equal("eng", res.MediaStreams[1].Language);
|
||||
Assert.Equal("Surround 6.1", res.MediaStreams[1].Title);
|
||||
|
||||
Assert.Equal(MediaStreamType.Audio, res.MediaStreams[2].Type);
|
||||
Assert.Equal("aac", res.MediaStreams[2].Codec);
|
||||
Assert.Equal(2, res.MediaStreams[2].Channels);
|
||||
Assert.False(res.MediaStreams[2].IsDefault);
|
||||
Assert.Equal("eng", res.MediaStreams[2].Language);
|
||||
Assert.Equal("Commentary", res.MediaStreams[2].Title);
|
||||
|
||||
Assert.Equal("spa", res.MediaStreams[3].Language);
|
||||
Assert.Equal(MediaStreamType.Subtitle, res.MediaStreams[3].Type);
|
||||
Assert.Equal("DVDSUB", res.MediaStreams[3].Codec);
|
||||
Assert.Null(res.MediaStreams[3].Title);
|
||||
Assert.False(res.MediaStreams[3].IsHearingImpaired);
|
||||
|
||||
Assert.Equal("eng", res.MediaStreams[4].Language);
|
||||
Assert.Equal(MediaStreamType.Subtitle, res.MediaStreams[4].Type);
|
||||
Assert.Equal("mov_text", res.MediaStreams[4].Codec);
|
||||
Assert.Null(res.MediaStreams[4].Title);
|
||||
Assert.True(res.MediaStreams[4].IsHearingImpaired);
|
||||
|
||||
Assert.Equal("eng", res.MediaStreams[5].Language);
|
||||
Assert.Equal(MediaStreamType.Subtitle, res.MediaStreams[5].Type);
|
||||
Assert.Equal("mov_text", res.MediaStreams[5].Codec);
|
||||
Assert.Equal("Commentary", res.MediaStreams[5].Title);
|
||||
Assert.False(res.MediaStreams[5].IsHearingImpaired);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetMediaInfo_TS_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/Probing/video_ts.json");
|
||||
var internalMediaInfoResult = JsonSerializer.Deserialize<InternalMediaInfoResult>(bytes, _jsonOptions);
|
||||
|
||||
MediaInfo res = _probeResultNormalizer.GetMediaInfo(internalMediaInfoResult, VideoType.VideoFile, false, "Test Data/Probing/video_metadata.mkv", MediaProtocol.File);
|
||||
|
||||
Assert.Equal(2, res.MediaStreams.Count);
|
||||
|
||||
Assert.False(res.MediaStreams[0].IsAVC);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetMediaInfo_WebM_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/Probing/video_webm.json");
|
||||
var internalMediaInfoResult = JsonSerializer.Deserialize<InternalMediaInfoResult>(bytes, _jsonOptions);
|
||||
|
||||
MediaInfo res = _probeResultNormalizer.GetMediaInfo(internalMediaInfoResult, VideoType.VideoFile, false, "Test Data/Probing/video_metadata.webm", MediaProtocol.File);
|
||||
|
||||
Assert.Equal("mkv,webm", res.Container);
|
||||
|
||||
Assert.Equal(2, res.MediaStreams.Count);
|
||||
|
||||
Assert.False(res.MediaStreams[0].IsAVC);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetMediaInfo_WebM_Like_Mkv()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/Probing/video_web_like_mkv_with_subtitle.json");
|
||||
var internalMediaInfoResult = JsonSerializer.Deserialize<InternalMediaInfoResult>(bytes, _jsonOptions);
|
||||
|
||||
MediaInfo res = _probeResultNormalizer.GetMediaInfo(internalMediaInfoResult, VideoType.VideoFile, false, "Test Data/Probing/video_metadata.mkv", MediaProtocol.File);
|
||||
|
||||
Assert.Equal("mkv", res.Container);
|
||||
Assert.Equal(3, res.MediaStreams.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetMediaInfo_ProgressiveVideoNoFieldOrder_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/Probing/video_progressive_no_field_order.json");
|
||||
|
||||
var internalMediaInfoResult = JsonSerializer.Deserialize<InternalMediaInfoResult>(bytes, _jsonOptions);
|
||||
MediaInfo res = _probeResultNormalizer.GetMediaInfo(internalMediaInfoResult, VideoType.VideoFile, false, "Test Data/Probing/video_progressive_no_field_order.mp4", MediaProtocol.File);
|
||||
|
||||
Assert.Equal(2, res.MediaStreams.Count);
|
||||
|
||||
Assert.NotNull(res.VideoStream);
|
||||
Assert.Equal(res.MediaStreams[0], res.VideoStream);
|
||||
Assert.Equal(0, res.VideoStream.Index);
|
||||
Assert.Equal("h264", res.VideoStream.Codec);
|
||||
Assert.Equal("Main", res.VideoStream.Profile);
|
||||
Assert.Equal(MediaStreamType.Video, res.VideoStream.Type);
|
||||
Assert.Equal(1080, res.VideoStream.Height);
|
||||
Assert.Equal(1920, res.VideoStream.Width);
|
||||
Assert.False(res.VideoStream.IsInterlaced);
|
||||
Assert.Equal("16:9", res.VideoStream.AspectRatio);
|
||||
Assert.Equal("yuv420p", res.VideoStream.PixelFormat);
|
||||
Assert.Equal(41d, res.VideoStream.Level);
|
||||
Assert.Equal(1, res.VideoStream.RefFrames);
|
||||
Assert.True(res.VideoStream.IsAVC);
|
||||
Assert.Equal(23.9760246f, res.VideoStream.RealFrameRate);
|
||||
Assert.Equal("1/24000", res.VideoStream.TimeBase);
|
||||
Assert.Equal(3948341, res.VideoStream.BitRate);
|
||||
Assert.Equal(8, res.VideoStream.BitDepth);
|
||||
Assert.True(res.VideoStream.IsDefault);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetMediaInfo_ProgressiveVideoNoFieldOrder2_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/Probing/video_progressive_no_field_order2.json");
|
||||
|
||||
var internalMediaInfoResult = JsonSerializer.Deserialize<InternalMediaInfoResult>(bytes, _jsonOptions);
|
||||
MediaInfo res = _probeResultNormalizer.GetMediaInfo(internalMediaInfoResult, VideoType.VideoFile, false, "Test Data/Probing/video_progressive_no_field_order2.mp4", MediaProtocol.File);
|
||||
|
||||
Assert.Single(res.MediaStreams);
|
||||
|
||||
Assert.NotNull(res.VideoStream);
|
||||
Assert.Equal(res.MediaStreams[0], res.VideoStream);
|
||||
Assert.Equal(0, res.VideoStream.Index);
|
||||
Assert.Equal("h264", res.VideoStream.Codec);
|
||||
Assert.Equal("High", res.VideoStream.Profile);
|
||||
Assert.Equal(MediaStreamType.Video, res.VideoStream.Type);
|
||||
Assert.Equal(720, res.VideoStream.Height);
|
||||
Assert.Equal(1280, res.VideoStream.Width);
|
||||
Assert.False(res.VideoStream.IsInterlaced);
|
||||
Assert.Equal("16:9", res.VideoStream.AspectRatio);
|
||||
Assert.Equal("yuv420p", res.VideoStream.PixelFormat);
|
||||
Assert.Equal(31d, res.VideoStream.Level);
|
||||
Assert.Equal(1, res.VideoStream.RefFrames);
|
||||
Assert.True(res.VideoStream.IsAVC);
|
||||
Assert.Equal(25f, res.VideoStream.RealFrameRate);
|
||||
Assert.Equal("1/12800", res.VideoStream.TimeBase);
|
||||
Assert.Equal(53288, res.VideoStream.BitRate);
|
||||
Assert.Equal(8, res.VideoStream.BitDepth);
|
||||
Assert.True(res.VideoStream.IsDefault);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetMediaInfo_InterlacedVideo_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/Probing/video_interlaced.json");
|
||||
|
||||
var internalMediaInfoResult = JsonSerializer.Deserialize<InternalMediaInfoResult>(bytes, _jsonOptions);
|
||||
MediaInfo res = _probeResultNormalizer.GetMediaInfo(internalMediaInfoResult, VideoType.VideoFile, false, "Test Data/Probing/video_interlaced.mp4", MediaProtocol.File);
|
||||
|
||||
Assert.Single(res.MediaStreams);
|
||||
|
||||
Assert.NotNull(res.VideoStream);
|
||||
Assert.Equal(res.MediaStreams[0], res.VideoStream);
|
||||
Assert.Equal(0, res.VideoStream.Index);
|
||||
Assert.Equal("h264", res.VideoStream.Codec);
|
||||
Assert.Equal("High", res.VideoStream.Profile);
|
||||
Assert.Equal(MediaStreamType.Video, res.VideoStream.Type);
|
||||
Assert.Equal(720, res.VideoStream.Height);
|
||||
Assert.Equal(1280, res.VideoStream.Width);
|
||||
Assert.True(res.VideoStream.IsInterlaced);
|
||||
Assert.Equal("16:9", res.VideoStream.AspectRatio);
|
||||
Assert.Equal("yuv420p", res.VideoStream.PixelFormat);
|
||||
Assert.Equal(40d, res.VideoStream.Level);
|
||||
Assert.Equal(1, res.VideoStream.RefFrames);
|
||||
Assert.True(res.VideoStream.IsAVC);
|
||||
Assert.Equal(25f, res.VideoStream.RealFrameRate);
|
||||
Assert.Equal("1/12800", res.VideoStream.TimeBase);
|
||||
Assert.Equal(56945, res.VideoStream.BitRate);
|
||||
Assert.Equal(8, res.VideoStream.BitDepth);
|
||||
Assert.True(res.VideoStream.IsDefault);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetMediaInfo_VideoWithSingleFrameMjpeg_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/Probing/video_single_frame_mjpeg.json");
|
||||
|
||||
var internalMediaInfoResult = JsonSerializer.Deserialize<InternalMediaInfoResult>(bytes, _jsonOptions);
|
||||
MediaInfo res = _probeResultNormalizer.GetMediaInfo(internalMediaInfoResult, VideoType.VideoFile, false, "Test Data/Probing/video_interlaced.mp4", MediaProtocol.File);
|
||||
|
||||
Assert.Equal(3, res.MediaStreams.Count);
|
||||
|
||||
Assert.NotNull(res.VideoStream);
|
||||
Assert.Equal(res.MediaStreams[0], res.VideoStream);
|
||||
Assert.Equal(0, res.VideoStream.Index);
|
||||
Assert.Equal("h264", res.VideoStream.Codec);
|
||||
Assert.Equal("High", res.VideoStream.Profile);
|
||||
Assert.Equal(MediaStreamType.Video, res.VideoStream.Type);
|
||||
Assert.Equal(1080, res.VideoStream.Height);
|
||||
Assert.Equal(1920, res.VideoStream.Width);
|
||||
Assert.False(res.VideoStream.IsInterlaced);
|
||||
Assert.Equal("16:9", res.VideoStream.AspectRatio);
|
||||
Assert.Equal("yuv420p", res.VideoStream.PixelFormat);
|
||||
Assert.Equal(42d, res.VideoStream.Level);
|
||||
Assert.Equal(1, res.VideoStream.RefFrames);
|
||||
Assert.True(res.VideoStream.IsAVC);
|
||||
Assert.Equal(50f, res.VideoStream.RealFrameRate);
|
||||
Assert.Equal("1/1000", res.VideoStream.TimeBase);
|
||||
Assert.Equal(8, res.VideoStream.BitDepth);
|
||||
Assert.True(res.VideoStream.IsDefault);
|
||||
|
||||
var mjpeg = res.MediaStreams[2];
|
||||
Assert.NotNull(mjpeg);
|
||||
Assert.Equal("mjpeg", mjpeg.Codec);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetMediaInfo_MusicVideo_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/Probing/music_video_metadata.json");
|
||||
var internalMediaInfoResult = JsonSerializer.Deserialize<InternalMediaInfoResult>(bytes, _jsonOptions);
|
||||
MediaInfo res = _probeResultNormalizer.GetMediaInfo(internalMediaInfoResult, VideoType.VideoFile, false, "Test Data/Probing/music_video.mkv", MediaProtocol.File);
|
||||
|
||||
Assert.Equal("The Title", res.Name);
|
||||
Assert.Equal("Title, The", res.ForcedSortName);
|
||||
Assert.Single(res.Artists);
|
||||
Assert.Equal("The Artist", res.Artists[0]);
|
||||
Assert.Equal("Album", res.Album);
|
||||
Assert.Equal(2021, res.ProductionYear);
|
||||
Assert.True(res.PremiereDate.HasValue);
|
||||
Assert.Equal(DateTime.Parse("2021-01-01T00:00Z", DateTimeFormatInfo.CurrentInfo, DateTimeStyles.AdjustToUniversal), res.PremiereDate);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetMediaInfo_GivenOriginalDateContainsOnlyYear_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/Probing/music_year_only_metadata.json");
|
||||
var internalMediaInfoResult = JsonSerializer.Deserialize<InternalMediaInfoResult>(bytes, _jsonOptions);
|
||||
MediaInfo res = _probeResultNormalizer.GetMediaInfo(internalMediaInfoResult, null, true, "Test Data/Probing/music.flac", MediaProtocol.File);
|
||||
|
||||
Assert.Equal("Baker Street", res.Name);
|
||||
Assert.Single(res.Artists);
|
||||
Assert.Equal("Gerry Rafferty", res.Artists[0]);
|
||||
Assert.Equal("City to City", res.Album);
|
||||
Assert.Equal(1978, res.ProductionYear);
|
||||
Assert.True(res.PremiereDate.HasValue);
|
||||
Assert.Equal(DateTime.Parse("1978-01-01T00:00Z", DateTimeFormatInfo.CurrentInfo, DateTimeStyles.AdjustToUniversal), res.PremiereDate);
|
||||
Assert.Contains("Electronic", res.Genres);
|
||||
Assert.Contains("Ambient", res.Genres);
|
||||
Assert.Contains("Pop", res.Genres);
|
||||
Assert.Contains("Jazz", res.Genres);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetMediaInfo_Music_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/Probing/music_metadata.json");
|
||||
var internalMediaInfoResult = JsonSerializer.Deserialize<InternalMediaInfoResult>(bytes, _jsonOptions);
|
||||
MediaInfo res = _probeResultNormalizer.GetMediaInfo(internalMediaInfoResult, null, true, "Test Data/Probing/music.flac", MediaProtocol.File);
|
||||
|
||||
Assert.Equal("UP NO MORE", res.Name);
|
||||
Assert.Single(res.Artists);
|
||||
Assert.Equal("TWICE", res.Artists[0]);
|
||||
Assert.Equal("Eyes wide open", res.Album);
|
||||
Assert.Equal(2020, res.ProductionYear);
|
||||
Assert.True(res.PremiereDate.HasValue);
|
||||
Assert.Equal(DateTime.Parse("2020-10-26T00:00Z", DateTimeFormatInfo.CurrentInfo, DateTimeStyles.AdjustToUniversal), res.PremiereDate);
|
||||
Assert.Equal(22, res.People.Length);
|
||||
Assert.Equal("Krysta Youngs", res.People[0].Name);
|
||||
Assert.Equal(PersonKind.Composer, res.People[0].Type);
|
||||
Assert.Equal("Julia Ross", res.People[1].Name);
|
||||
Assert.Equal(PersonKind.Composer, res.People[1].Type);
|
||||
Assert.Equal("Yiwoomin", res.People[2].Name);
|
||||
Assert.Equal(PersonKind.Composer, res.People[2].Type);
|
||||
Assert.Equal("Ji-hyo Park", res.People[3].Name);
|
||||
Assert.Equal(PersonKind.Lyricist, res.People[3].Type);
|
||||
Assert.Equal("Yiwoomin", res.People[4].Name);
|
||||
Assert.Equal(PersonKind.Actor, res.People[4].Type);
|
||||
Assert.Equal("Electric Piano", res.People[4].Role);
|
||||
Assert.Equal(4, res.Genres.Length);
|
||||
Assert.Contains("Electronic", res.Genres);
|
||||
Assert.Contains("Trance", res.Genres);
|
||||
Assert.Contains("Dance", res.Genres);
|
||||
Assert.Contains("Jazz", res.Genres);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using MediaBrowser.MediaEncoding.Subtitles;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.MediaEncoding.Subtitles.Tests
|
||||
{
|
||||
public class AssParserTests
|
||||
{
|
||||
[Fact]
|
||||
public void Parse_Valid_Success()
|
||||
{
|
||||
using var stream = File.OpenRead("Test Data/example.ass");
|
||||
|
||||
var parsed = new SubtitleEditParser(new NullLogger<SubtitleEditParser>()).Parse(stream, "ass");
|
||||
Assert.Single(parsed.TrackEvents);
|
||||
var trackEvent = parsed.TrackEvents[0];
|
||||
|
||||
Assert.Equal("1", trackEvent.Id);
|
||||
Assert.Equal(TimeSpan.Parse("00:00:01.18", CultureInfo.InvariantCulture).Ticks, trackEvent.StartPositionTicks);
|
||||
Assert.Equal(TimeSpan.Parse("00:00:06.85", CultureInfo.InvariantCulture).Ticks, trackEvent.EndPositionTicks);
|
||||
Assert.Equal("{\\pos(400,570)}Like an Angel with pity on nobody" + Environment.NewLine + "The second line in subtitle", trackEvent.Text);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using MediaBrowser.MediaEncoding.Subtitles;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.MediaEncoding.Subtitles.Tests
|
||||
{
|
||||
public class SrtParserTests
|
||||
{
|
||||
[Fact]
|
||||
public void Parse_Valid_Success()
|
||||
{
|
||||
using var stream = File.OpenRead("Test Data/example.srt");
|
||||
|
||||
var parsed = new SubtitleEditParser(new NullLogger<SubtitleEditParser>()).Parse(stream, "srt");
|
||||
Assert.Equal(2, parsed.TrackEvents.Count);
|
||||
|
||||
var trackEvent1 = parsed.TrackEvents[0];
|
||||
Assert.Equal("1", trackEvent1.Id);
|
||||
Assert.Equal(TimeSpan.Parse("00:02:17.440", CultureInfo.InvariantCulture).Ticks, trackEvent1.StartPositionTicks);
|
||||
Assert.Equal(TimeSpan.Parse("00:02:20.375", CultureInfo.InvariantCulture).Ticks, trackEvent1.EndPositionTicks);
|
||||
Assert.Equal("Senator, we're making" + Environment.NewLine + "our final approach into Coruscant.", trackEvent1.Text);
|
||||
|
||||
var trackEvent2 = parsed.TrackEvents[1];
|
||||
Assert.Equal("2", trackEvent2.Id);
|
||||
Assert.Equal(TimeSpan.Parse("00:02:20.476", CultureInfo.InvariantCulture).Ticks, trackEvent2.StartPositionTicks);
|
||||
Assert.Equal(TimeSpan.Parse("00:02:22.501", CultureInfo.InvariantCulture).Ticks, trackEvent2.EndPositionTicks);
|
||||
Assert.Equal("Very good, Lieutenant.", trackEvent2.Text);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Parse_EmptyNewlineBetweenText_Success()
|
||||
{
|
||||
using var stream = File.OpenRead("Test Data/example2.srt");
|
||||
|
||||
var parsed = new SubtitleEditParser(new NullLogger<SubtitleEditParser>()).Parse(stream, "srt");
|
||||
Assert.Equal(2, parsed.TrackEvents.Count);
|
||||
|
||||
var trackEvent1 = parsed.TrackEvents[0];
|
||||
Assert.Equal("311", trackEvent1.Id);
|
||||
Assert.Equal(TimeSpan.Parse("00:16:46.465", CultureInfo.InvariantCulture).Ticks, trackEvent1.StartPositionTicks);
|
||||
Assert.Equal(TimeSpan.Parse("00:16:49.009", CultureInfo.InvariantCulture).Ticks, trackEvent1.EndPositionTicks);
|
||||
Assert.Equal("Una vez que la gente se entere" + Environment.NewLine + Environment.NewLine + "de que ustedes están aquí,", trackEvent1.Text);
|
||||
|
||||
var trackEvent2 = parsed.TrackEvents[1];
|
||||
Assert.Equal("312", trackEvent2.Id);
|
||||
Assert.Equal(TimeSpan.Parse("00:16:49.092", CultureInfo.InvariantCulture).Ticks, trackEvent2.StartPositionTicks);
|
||||
Assert.Equal(TimeSpan.Parse("00:16:51.470", CultureInfo.InvariantCulture).Ticks, trackEvent2.EndPositionTicks);
|
||||
Assert.Equal("este lugar se convertirá" + Environment.NewLine + Environment.NewLine + "en un maldito zoológico.", trackEvent2.Text);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using MediaBrowser.MediaEncoding.Subtitles;
|
||||
using MediaBrowser.Model.MediaInfo;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.MediaEncoding.Subtitles.Tests
|
||||
{
|
||||
public class SsaParserTests
|
||||
{
|
||||
private readonly SubtitleEditParser _parser = new SubtitleEditParser(new NullLogger<SubtitleEditParser>());
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(Parse_MultipleDialogues_TestData))]
|
||||
public void Parse_MultipleDialogues_Success(string ssa, IReadOnlyList<SubtitleTrackEvent> expectedSubtitleTrackEvents)
|
||||
{
|
||||
using Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(ssa));
|
||||
|
||||
SubtitleTrackInfo subtitleTrackInfo = _parser.Parse(stream, "ssa");
|
||||
|
||||
Assert.Equal(expectedSubtitleTrackEvents.Count, subtitleTrackInfo.TrackEvents.Count);
|
||||
|
||||
for (int i = 0; i < expectedSubtitleTrackEvents.Count; ++i)
|
||||
{
|
||||
SubtitleTrackEvent expected = expectedSubtitleTrackEvents[i];
|
||||
SubtitleTrackEvent actual = subtitleTrackInfo.TrackEvents[i];
|
||||
|
||||
Assert.Equal(expected.Id, actual.Id);
|
||||
Assert.Equal(expected.Text, actual.Text);
|
||||
Assert.Equal(expected.StartPositionTicks, actual.StartPositionTicks);
|
||||
Assert.Equal(expected.EndPositionTicks, actual.EndPositionTicks);
|
||||
}
|
||||
}
|
||||
|
||||
public static TheoryData<string, IReadOnlyList<SubtitleTrackEvent>> Parse_MultipleDialogues_TestData()
|
||||
{
|
||||
var data = new TheoryData<string, IReadOnlyList<SubtitleTrackEvent>>();
|
||||
|
||||
data.Add(
|
||||
@"[Events]
|
||||
Format: Layer, Start, End, Text
|
||||
Dialogue: ,0:00:01.18,0:00:01.85,dialogue1
|
||||
Dialogue: ,0:00:02.18,0:00:02.85,dialogue2
|
||||
Dialogue: ,0:00:03.18,0:00:03.85,dialogue3
|
||||
",
|
||||
new List<SubtitleTrackEvent>
|
||||
{
|
||||
new SubtitleTrackEvent("1", "dialogue1")
|
||||
{
|
||||
StartPositionTicks = 11800000,
|
||||
EndPositionTicks = 18500000
|
||||
},
|
||||
new SubtitleTrackEvent("2", "dialogue2")
|
||||
{
|
||||
StartPositionTicks = 21800000,
|
||||
EndPositionTicks = 28500000
|
||||
},
|
||||
new SubtitleTrackEvent("3", "dialogue3")
|
||||
{
|
||||
StartPositionTicks = 31800000,
|
||||
EndPositionTicks = 38500000
|
||||
}
|
||||
});
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Parse_Valid_Success()
|
||||
{
|
||||
using var stream = File.OpenRead("Test Data/example.ssa");
|
||||
|
||||
var parsed = _parser.Parse(stream, "ssa");
|
||||
Assert.Single(parsed.TrackEvents);
|
||||
var trackEvent = parsed.TrackEvents[0];
|
||||
|
||||
Assert.Equal("1", trackEvent.Id);
|
||||
Assert.Equal(TimeSpan.Parse("00:00:01.18", CultureInfo.InvariantCulture).Ticks, trackEvent.StartPositionTicks);
|
||||
Assert.Equal(TimeSpan.Parse("00:00:06.85", CultureInfo.InvariantCulture).Ticks, trackEvent.EndPositionTicks);
|
||||
Assert.Equal("{\\pos(400,570)}Like an angel with pity on nobody", trackEvent.Text);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using AutoFixture;
|
||||
using AutoFixture.AutoMoq;
|
||||
using MediaBrowser.MediaEncoding.Subtitles;
|
||||
using MediaBrowser.Model.Dto;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.MediaInfo;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.MediaEncoding.Subtitles.Tests
|
||||
{
|
||||
public class SubtitleEncoderTests
|
||||
{
|
||||
public static TheoryData<MediaSourceInfo, MediaStream, SubtitleEncoder.SubtitleInfo> GetReadableFile_Valid_TestData()
|
||||
{
|
||||
var data = new TheoryData<MediaSourceInfo, MediaStream, SubtitleEncoder.SubtitleInfo>();
|
||||
|
||||
data.Add(
|
||||
new MediaSourceInfo()
|
||||
{
|
||||
Protocol = MediaProtocol.File
|
||||
},
|
||||
new MediaStream()
|
||||
{
|
||||
Path = "/media/sub.ass",
|
||||
IsExternal = true
|
||||
},
|
||||
new SubtitleEncoder.SubtitleInfo()
|
||||
{
|
||||
Path = "/media/sub.ass",
|
||||
Protocol = MediaProtocol.File,
|
||||
Format = "ass",
|
||||
IsExternal = true
|
||||
});
|
||||
|
||||
data.Add(
|
||||
new MediaSourceInfo()
|
||||
{
|
||||
Protocol = MediaProtocol.File
|
||||
},
|
||||
new MediaStream()
|
||||
{
|
||||
Path = "/media/sub.ssa",
|
||||
IsExternal = true
|
||||
},
|
||||
new SubtitleEncoder.SubtitleInfo()
|
||||
{
|
||||
Path = "/media/sub.ssa",
|
||||
Protocol = MediaProtocol.File,
|
||||
Format = "ssa",
|
||||
IsExternal = true
|
||||
});
|
||||
|
||||
data.Add(
|
||||
new MediaSourceInfo()
|
||||
{
|
||||
Protocol = MediaProtocol.File
|
||||
},
|
||||
new MediaStream()
|
||||
{
|
||||
Path = "/media/sub.srt",
|
||||
IsExternal = true
|
||||
},
|
||||
new SubtitleEncoder.SubtitleInfo()
|
||||
{
|
||||
Path = "/media/sub.srt",
|
||||
Protocol = MediaProtocol.File,
|
||||
Format = "srt",
|
||||
IsExternal = true
|
||||
});
|
||||
|
||||
data.Add(
|
||||
new MediaSourceInfo()
|
||||
{
|
||||
Protocol = MediaProtocol.Http
|
||||
},
|
||||
new MediaStream()
|
||||
{
|
||||
Path = "/media/sub.ass",
|
||||
IsExternal = true
|
||||
},
|
||||
new SubtitleEncoder.SubtitleInfo()
|
||||
{
|
||||
Path = "/media/sub.ass",
|
||||
Protocol = MediaProtocol.File,
|
||||
Format = "ass",
|
||||
IsExternal = true
|
||||
});
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(GetReadableFile_Valid_TestData))]
|
||||
public async Task GetReadableFile_Valid_Success(MediaSourceInfo mediaSource, MediaStream subtitleStream, SubtitleEncoder.SubtitleInfo subtitleInfo)
|
||||
{
|
||||
var fixture = new Fixture().Customize(new AutoMoqCustomization { ConfigureMembers = true });
|
||||
var subtitleEncoder = fixture.Create<SubtitleEncoder>();
|
||||
var result = await subtitleEncoder.GetReadableFile(mediaSource, subtitleStream, CancellationToken.None);
|
||||
Assert.Equal(subtitleInfo.Path, result.Path);
|
||||
Assert.Equal(subtitleInfo.Protocol, result.Protocol);
|
||||
Assert.Equal(subtitleInfo.Format, result.Format);
|
||||
Assert.Equal(subtitleInfo.IsExternal, result.IsExternal);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
{
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "flac",
|
||||
"codec_long_name": "FLAC (Free Lossless Audio Codec)",
|
||||
"codec_type": "audio",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"sample_fmt": "s16",
|
||||
"sample_rate": "44100",
|
||||
"channels": 2,
|
||||
"channel_layout": "stereo",
|
||||
"bits_per_sample": 0,
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/44100",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"duration_ts": 9447984,
|
||||
"duration": "214.240000",
|
||||
"bits_per_raw_sample": "16",
|
||||
"disposition": {
|
||||
"default": 0,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"codec_name": "mjpeg",
|
||||
"codec_long_name": "Motion JPEG",
|
||||
"profile": "Baseline",
|
||||
"codec_type": "video",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"width": 500,
|
||||
"height": 500,
|
||||
"coded_width": 500,
|
||||
"coded_height": 500,
|
||||
"closed_captions": 0,
|
||||
"has_b_frames": 0,
|
||||
"sample_aspect_ratio": "1:1",
|
||||
"display_aspect_ratio": "1:1",
|
||||
"pix_fmt": "yuvj420p",
|
||||
"level": -99,
|
||||
"color_range": "pc",
|
||||
"color_space": "bt470bg",
|
||||
"chroma_location": "center",
|
||||
"refs": 1,
|
||||
"r_frame_rate": "90000/1",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/90000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"duration_ts": 19281600,
|
||||
"duration": "214.240000",
|
||||
"bits_per_raw_sample": "8",
|
||||
"disposition": {
|
||||
"default": 0,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 1,
|
||||
"timed_thumbnails": 0
|
||||
},
|
||||
"tags": {
|
||||
"comment": "Cover (front)"
|
||||
}
|
||||
}
|
||||
],
|
||||
"format": {
|
||||
"filename": "03 UP NO MORE.flac",
|
||||
"nb_streams": 2,
|
||||
"nb_programs": 0,
|
||||
"format_name": "flac",
|
||||
"format_long_name": "raw FLAC",
|
||||
"start_time": "0.000000",
|
||||
"duration": "214.240000",
|
||||
"size": "28714641",
|
||||
"bit_rate": "1072242",
|
||||
"probe_score": 100,
|
||||
"tags": {
|
||||
"MUSICBRAINZ_RELEASEGROUPID": "aa05ff10-8589-4c9c-a0d4-6b024f4e4556",
|
||||
"ORIGINALDATE": "2020-10-26",
|
||||
"ORIGINALYEAR": "2020",
|
||||
"RELEASETYPE": "album",
|
||||
"MUSICBRAINZ_ALBUMID": "222e6610-75c9-400e-8dc3-bb61f9fc5ca7",
|
||||
"SCRIPT": "Latn",
|
||||
"ALBUM": "Eyes wide open",
|
||||
"RELEASECOUNTRY": "JP",
|
||||
"BARCODE": "190295105280",
|
||||
"LABEL": "JYP Entertainment",
|
||||
"RELEASESTATUS": "official",
|
||||
"DATE": "2020-10-26",
|
||||
"MUSICBRAINZ_ALBUMARTISTID": "8da127cc-c432-418f-b356-ef36210d82ac",
|
||||
"album_artist": "TWICE",
|
||||
"ALBUMARTISTSORT": "TWICE",
|
||||
"TOTALDISCS": "1",
|
||||
"TOTALTRACKS": "13",
|
||||
"MEDIA": "Digital Media",
|
||||
"disc": "1",
|
||||
"MUSICBRAINZ_TRACKID": "7d1a1044-b564-480d-9df3-22f9656fdb97",
|
||||
"TITLE": "UP NO MORE",
|
||||
"ISRC": "US5TA2000136",
|
||||
"PERFORMER": "Yiwoomin (electric piano);Yiwoomin (synthesizer);Yiwoomin (bass);Yiwoomin (guitar);TWICE;Tzu-yu Chou (vocals);Momo Hirai (vocals);Na-yeon Im (vocals);Da-hyun Kim (vocals);Sana Minatozaki (vocals);Mina Myoui (vocals);Ji-hyo Park (vocals);Chae-young Son (vocals);Jeong-yeon Yoo (vocals);Perrie (background vocals)",
|
||||
"MIXER": "Bong Won Shin",
|
||||
"ARRANGER": "Krysta Youngs;Julia Ross;Yiwoomin",
|
||||
"MUSICBRAINZ_WORKID": "02b37083-0337-4721-9f17-bf31971043e8",
|
||||
"LANGUAGE": "kor;eng",
|
||||
"WORK": "Up No More",
|
||||
"COMPOSER": "Krysta Youngs;Julia Ross;Yiwoomin",
|
||||
"COMPOSERSORT": "Krysta Youngs;Ross, Julia;Yiwoomin",
|
||||
"LYRICIST": "Ji-hyo Park",
|
||||
"MUSICBRAINZ_ARTISTID": "8da127cc-c432-418f-b356-ef36210d82ac",
|
||||
"ARTIST": "TWICE",
|
||||
"ARTISTSORT": "TWICE",
|
||||
"ARTISTS": "TWICE",
|
||||
"MUSICBRAINZ_RELEASETRACKID": "ad49b840-da9e-4e7c-924b-29fdee187052",
|
||||
"track": "3",
|
||||
"GENRE": "Electronic;Trance;Dance;Jazz",
|
||||
"WEBSITE": "http://twice.jype.com/;http://www.twicejapan.com/",
|
||||
"ACOUSTID_ID": "aae2e972-108c-4d0c-8e31-9d078283e3dc",
|
||||
"MOOD": "Not acoustic;Not aggressive;Electronic;Happy;Party;Not relaxed;Not sad",
|
||||
"TRACKTOTAL": "13",
|
||||
"DISCTOTAL": "1"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
{
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "h264",
|
||||
"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
|
||||
"profile": "High",
|
||||
"codec_type": "video",
|
||||
"codec_time_base": "1001/48000",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"width": 1920,
|
||||
"height": 1080,
|
||||
"coded_width": 1920,
|
||||
"coded_height": 1088,
|
||||
"closed_captions": 0,
|
||||
"has_b_frames": 0,
|
||||
"sample_aspect_ratio": "1:1",
|
||||
"display_aspect_ratio": "16:9",
|
||||
"pix_fmt": "yuv420p",
|
||||
"level": 42,
|
||||
"chroma_location": "left",
|
||||
"field_order": "progressive",
|
||||
"refs": 1,
|
||||
"is_avc": "true",
|
||||
"nal_length_size": "4",
|
||||
"r_frame_rate": "24000/1001",
|
||||
"avg_frame_rate": "24000/1001",
|
||||
"time_base": "1/1000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"bits_per_raw_sample": "8",
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
},
|
||||
"tags": {
|
||||
"language": "eng"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"codec_name": "aac",
|
||||
"codec_long_name": "AAC (Advanced Audio Coding)",
|
||||
"profile": "LC",
|
||||
"codec_type": "audio",
|
||||
"codec_time_base": "1/48000",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"sample_fmt": "fltp",
|
||||
"sample_rate": "48000",
|
||||
"channels": 2,
|
||||
"channel_layout": "stereo",
|
||||
"bits_per_sample": 0,
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/1000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
},
|
||||
"tags": {
|
||||
"language": "eng"
|
||||
}
|
||||
}
|
||||
],
|
||||
"chapters": [
|
||||
],
|
||||
"format": {
|
||||
"filename": "music_video.mkv",
|
||||
"nb_streams": 2,
|
||||
"nb_programs": 0,
|
||||
"format_name": "matroska,webm",
|
||||
"format_long_name": "Matroska / WebM",
|
||||
"start_time": "0.000000",
|
||||
"duration": "180.000000",
|
||||
"size": "500000000",
|
||||
"bit_rate": "22222222",
|
||||
"probe_score": 100,
|
||||
"tags": {
|
||||
"TITLE-eng": "The Title",
|
||||
"TITLESORT": "Title, The",
|
||||
"ARTIST": "The Artist",
|
||||
"ARTISTSORT": "Artist, The",
|
||||
"ALBUM": "Album",
|
||||
"DATE_RELEASED": "2021-01-01"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
{
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "flac",
|
||||
"codec_long_name": "FLAC (Free Lossless Audio Codec)",
|
||||
"codec_type": "audio",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"sample_fmt": "s16",
|
||||
"sample_rate": "44100",
|
||||
"channels": 2,
|
||||
"channel_layout": "stereo",
|
||||
"bits_per_sample": 0,
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/44100",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"duration_ts": 16394616,
|
||||
"duration": "371.760000",
|
||||
"bits_per_raw_sample": "16",
|
||||
"disposition": {
|
||||
"default": 0,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"codec_name": "mjpeg",
|
||||
"codec_long_name": "Motion JPEG",
|
||||
"profile": "Baseline",
|
||||
"codec_type": "video",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"width": 500,
|
||||
"height": 498,
|
||||
"coded_width": 500,
|
||||
"coded_height": 498,
|
||||
"closed_captions": 0,
|
||||
"has_b_frames": 0,
|
||||
"sample_aspect_ratio": "1:1",
|
||||
"display_aspect_ratio": "250:249",
|
||||
"pix_fmt": "yuvj420p",
|
||||
"level": -99,
|
||||
"color_range": "pc",
|
||||
"color_space": "bt470bg",
|
||||
"chroma_location": "center",
|
||||
"refs": 1,
|
||||
"r_frame_rate": "90000/1",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/90000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"duration_ts": 33458400,
|
||||
"duration": "371.760000",
|
||||
"bits_per_raw_sample": "8",
|
||||
"disposition": {
|
||||
"default": 0,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 1,
|
||||
"timed_thumbnails": 0
|
||||
},
|
||||
"tags": {
|
||||
"comment": "Cover (front)"
|
||||
}
|
||||
}
|
||||
],
|
||||
"format": {
|
||||
"filename": "02 Baker Street.flac",
|
||||
"nb_streams": 2,
|
||||
"nb_programs": 0,
|
||||
"format_name": "flac",
|
||||
"format_long_name": "raw FLAC",
|
||||
"start_time": "0.000000",
|
||||
"duration": "371.760000",
|
||||
"size": "37072649",
|
||||
"bit_rate": "797775",
|
||||
"probe_score": 100,
|
||||
"tags": {
|
||||
"MUSICBRAINZ_RELEASEGROUPID": "238c3fb4-5792-342b-b217-02f66298b424",
|
||||
"ORIGINALDATE": "1978",
|
||||
"ORIGINALYEAR": "1978",
|
||||
"RELEASETYPE": "album",
|
||||
"MUSICBRAINZ_ALBUMID": "30156786-e511-3106-ac95-66f0e880b24b",
|
||||
"ASIN": "B000007O5H",
|
||||
"MUSICBRAINZ_ALBUMARTISTID": "563201cb-721c-4cfb-acca-c1ba69e3d1fb",
|
||||
"album_artist": "Gerry Rafferty",
|
||||
"ALBUMARTISTSORT": "Rafferty, Gerry",
|
||||
"LABEL": "Liberty EMI Records UK",
|
||||
"CATALOGNUMBER": "CDP 7 46049 2",
|
||||
"DATE": "1989-07-26",
|
||||
"RELEASECOUNTRY": "GB",
|
||||
"BARCODE": "077774604925",
|
||||
"ALBUM": "City to City",
|
||||
"SCRIPT": "Latn",
|
||||
"RELEASESTATUS": "official",
|
||||
"TOTALDISCS": "1",
|
||||
"disc": "1",
|
||||
"MEDIA": "CD",
|
||||
"TOTALTRACKS": "10",
|
||||
"MUSICBRAINZ_TRACKID": "9235e22e-afbd-48f7-b329-21dae6da2810",
|
||||
"ISRC": "GBAYE1100924;GBAYE7800619",
|
||||
"PERFORMER": "Hugh Burns (electric guitar);Nigel Jenkins (electric guitar);Tommy Eyre (keyboard and Moog);Glen LeFleur (percussion);Raphael Ravenscroft (saxophone);Henry Spinetti (drums (drum set));Gary Taylor (bass);Gerry Rafferty (lead vocals)",
|
||||
"ARRANGER": "Graham Preskett",
|
||||
"MIXER": "Declan O’Doherty",
|
||||
"PRODUCER": "Hugh Murphy;Gerry Rafferty",
|
||||
"MUSICBRAINZ_WORKID": "a9eb3c45-784c-3c32-860c-4b406f03961b",
|
||||
"LANGUAGE": "eng",
|
||||
"WORK": "Baker Street",
|
||||
"COMPOSER": "Gerry Rafferty",
|
||||
"COMPOSERSORT": "Rafferty, Gerry",
|
||||
"LYRICIST": "Gerry Rafferty",
|
||||
"TITLE": "Baker Street",
|
||||
"MUSICBRAINZ_ARTISTID": "563201cb-721c-4cfb-acca-c1ba69e3d1fb",
|
||||
"ARTIST": "Gerry Rafferty",
|
||||
"ARTISTSORT": "Rafferty, Gerry",
|
||||
"ARTISTS": "Gerry Rafferty",
|
||||
"MUSICBRAINZ_RELEASETRACKID": "407cf7f7-440d-3e76-8b89-8686198868ea",
|
||||
"track": "2",
|
||||
"GENRE": "Electronic;Ambient;Pop;Jazz",
|
||||
"WEBSITE": "http://www.gerryrafferty.com/",
|
||||
"ACOUSTID_ID": "68f8d979-a659-4aa0-a216-eb3721a951eb",
|
||||
"MOOD": "Acoustic;Not aggressive;Not electronic;Not happy;Party;Relaxed;Not sad",
|
||||
"TRACKTOTAL": "10",
|
||||
"DISCTOTAL": "1"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "h264",
|
||||
"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
|
||||
"profile": "High",
|
||||
"codec_type": "video",
|
||||
"codec_tag_string": "avc1",
|
||||
"codec_tag": "0x31637661",
|
||||
"width": 1280,
|
||||
"height": 720,
|
||||
"coded_width": 1280,
|
||||
"coded_height": 720,
|
||||
"closed_captions": 0,
|
||||
"film_grain": 0,
|
||||
"has_b_frames": 2,
|
||||
"pix_fmt": "yuv420p",
|
||||
"level": 40,
|
||||
"chroma_location": "left",
|
||||
"field_order": "tt",
|
||||
"refs": 1,
|
||||
"is_avc": "true",
|
||||
"nal_length_size": "4",
|
||||
"id": "0x1",
|
||||
"r_frame_rate": "25/1",
|
||||
"avg_frame_rate": "25/1",
|
||||
"time_base": "1/12800",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"duration_ts": 3840000,
|
||||
"duration": "300.000000",
|
||||
"bit_rate": "56945",
|
||||
"bits_per_raw_sample": "8",
|
||||
"nb_frames": "7500",
|
||||
"extradata_size": 42,
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0,
|
||||
"captions": 0,
|
||||
"descriptions": 0,
|
||||
"metadata": 0,
|
||||
"dependent": 0,
|
||||
"still_image": 0
|
||||
},
|
||||
"tags": {
|
||||
"language": "und",
|
||||
"handler_name": "VideoHandler",
|
||||
"vendor_id": "[0][0][0][0]"
|
||||
}
|
||||
}
|
||||
],
|
||||
"format": {
|
||||
"filename": "test-gray.720i.mp4",
|
||||
"nb_streams": 1,
|
||||
"nb_programs": 0,
|
||||
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
|
||||
"format_long_name": "QuickTime / MOV",
|
||||
"start_time": "0.000000",
|
||||
"duration": "300.000000",
|
||||
"size": "2223957",
|
||||
"bit_rate": "59305",
|
||||
"probe_score": 100,
|
||||
"tags": {
|
||||
"major_brand": "isom",
|
||||
"minor_version": "512",
|
||||
"compatible_brands": "isomiso2avc1mp41",
|
||||
"encoder": "Lavf58.20.100"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,177 @@
|
||||
{
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "h264",
|
||||
"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
|
||||
"profile": "High 4:4:4 Predictive",
|
||||
"codec_type": "video",
|
||||
"codec_time_base": "1/50",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"width": 320,
|
||||
"height": 240,
|
||||
"coded_width": 320,
|
||||
"coded_height": 240,
|
||||
"closed_captions": 0,
|
||||
"has_b_frames": 2,
|
||||
"sample_aspect_ratio": "1:1",
|
||||
"display_aspect_ratio": "4:3",
|
||||
"pix_fmt": "yuv444p",
|
||||
"level": 13,
|
||||
"chroma_location": "left",
|
||||
"field_order": "progressive",
|
||||
"refs": 1,
|
||||
"is_avc": "true",
|
||||
"nal_length_size": "4",
|
||||
"r_frame_rate": "25/1",
|
||||
"avg_frame_rate": "25/1",
|
||||
"time_base": "1/1000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"bits_per_raw_sample": "8",
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
},
|
||||
"tags": {
|
||||
"ENCODER": "Lavc57.107.100 libx264",
|
||||
"DURATION": "00:00:01.000000000"
|
||||
},
|
||||
"side_data_list": [
|
||||
{
|
||||
"side_data_type": "DOVI configuration record",
|
||||
"dv_version_major": 1,
|
||||
"dv_version_minor": 0,
|
||||
"dv_profile": 5,
|
||||
"dv_level": 6,
|
||||
"rpu_present_flag": 1,
|
||||
"el_present_flag": 0,
|
||||
"bl_present_flag": 1,
|
||||
"dv_bl_signal_compatibility_id": 0
|
||||
},
|
||||
{
|
||||
"side_data_type": "Display Matrix",
|
||||
"rotation": -180
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"codec_name": "eac3",
|
||||
"codec_long_name": "ATSC A/52B (AC-3, E-AC-3)",
|
||||
"profile": "Dolby Digital Plus + Dolby Atmos",
|
||||
"codec_type": "audio",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"sample_fmt": "fltp",
|
||||
"sample_rate": "48000",
|
||||
"channels": 6,
|
||||
"channel_layout": "5.1(side)",
|
||||
"bits_per_sample": 0,
|
||||
"initial_padding": 0,
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/1000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"bit_rate": "640000",
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 1,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0,
|
||||
"captions": 0,
|
||||
"descriptions": 0,
|
||||
"metadata": 0,
|
||||
"dependent": 0,
|
||||
"still_image": 0
|
||||
},
|
||||
"tags": {
|
||||
"language": "eng"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 2,
|
||||
"codec_name": "dts",
|
||||
"codec_long_name": "DCA (DTS Coherent Acoustics)",
|
||||
"profile": "DTS-HD MA + DTS:X",
|
||||
"codec_type": "audio",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"sample_fmt": "s32p",
|
||||
"sample_rate": "48000",
|
||||
"channels": 8,
|
||||
"channel_layout": "7.1",
|
||||
"bits_per_sample": 0,
|
||||
"initial_padding": 0,
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/1000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"bits_per_raw_sample": "24",
|
||||
"disposition": {
|
||||
"default": 0,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0,
|
||||
"captions": 0,
|
||||
"descriptions": 0,
|
||||
"metadata": 0,
|
||||
"dependent": 0,
|
||||
"still_image": 0
|
||||
},
|
||||
"tags": {
|
||||
"language": "eng"
|
||||
}
|
||||
}
|
||||
],
|
||||
"chapters": [
|
||||
|
||||
],
|
||||
"format": {
|
||||
"filename": "some_metadata.mkv",
|
||||
"nb_streams": 3,
|
||||
"nb_programs": 0,
|
||||
"format_name": "matroska,webm",
|
||||
"format_long_name": "Matroska / WebM",
|
||||
"start_time": "0.000000",
|
||||
"duration": "1.000000",
|
||||
"size": "8679",
|
||||
"bit_rate": "69432",
|
||||
"probe_score": 100,
|
||||
"tags": {
|
||||
"DESCRIPTION": "Just color bars",
|
||||
"ARCHIVAL": "yes",
|
||||
"PRESERVE_THIS": "okay",
|
||||
"ENCODER": "Lavf57.83.100"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,260 @@
|
||||
{
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "h264",
|
||||
"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
|
||||
"profile": "High",
|
||||
"codec_type": "video",
|
||||
"codec_tag_string": "avc1",
|
||||
"codec_tag": "0x31637661",
|
||||
"width": 720,
|
||||
"height": 358,
|
||||
"coded_width": 720,
|
||||
"coded_height": 358,
|
||||
"closed_captions": 0,
|
||||
"has_b_frames": 2,
|
||||
"sample_aspect_ratio": "32:27",
|
||||
"display_aspect_ratio": "1280:537",
|
||||
"pix_fmt": "yuv420p",
|
||||
"level": 31,
|
||||
"color_range": "tv",
|
||||
"color_space": "smpte170m",
|
||||
"color_transfer": "bt709",
|
||||
"color_primaries": "smpte170m",
|
||||
"chroma_location": "left",
|
||||
"refs": 1,
|
||||
"is_avc": "true",
|
||||
"nal_length_size": "4",
|
||||
"r_frame_rate": "120/1",
|
||||
"avg_frame_rate": "1704753000/71073479",
|
||||
"time_base": "1/90000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"duration_ts": 1421469580,
|
||||
"duration": "15794.106444",
|
||||
"bit_rate": "1147365",
|
||||
"bits_per_raw_sample": "8",
|
||||
"nb_frames": "378834",
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
},
|
||||
"tags": {
|
||||
"creation_time": "2021-09-13T22:42:42.000000Z",
|
||||
"language": "und",
|
||||
"handler_name": "VideoHandler",
|
||||
"vendor_id": "[0][0][0][0]"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"codec_name": "aac",
|
||||
"codec_long_name": "AAC (Advanced Audio Coding)",
|
||||
"profile": "LC",
|
||||
"codec_type": "audio",
|
||||
"codec_tag_string": "mp4a",
|
||||
"codec_tag": "0x6134706d",
|
||||
"sample_fmt": "fltp",
|
||||
"sample_rate": "48000",
|
||||
"channels": 7,
|
||||
"bits_per_sample": 0,
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/48000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"duration_ts": 758115312,
|
||||
"duration": "15794.069000",
|
||||
"bit_rate": "224197",
|
||||
"nb_frames": "740348",
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
},
|
||||
"tags": {
|
||||
"creation_time": "2021-09-13T22:42:42.000000Z",
|
||||
"language": "eng",
|
||||
"handler_name": "Surround 6.1",
|
||||
"vendor_id": "[0][0][0][0]"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 2,
|
||||
"codec_name": "aac",
|
||||
"codec_long_name": "AAC (Advanced Audio Coding)",
|
||||
"profile": "LC",
|
||||
"codec_type": "audio",
|
||||
"codec_tag_string": "mp4a",
|
||||
"codec_tag": "0x6134706d",
|
||||
"sample_fmt": "fltp",
|
||||
"sample_rate": "48000",
|
||||
"channels": 2,
|
||||
"channel_layout": "stereo",
|
||||
"bits_per_sample": 0,
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/48000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"duration_ts": 758114304,
|
||||
"duration": "15794.048000",
|
||||
"bit_rate": "160519",
|
||||
"nb_frames": "740347",
|
||||
"disposition": {
|
||||
"default": 0,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
},
|
||||
"tags": {
|
||||
"creation_time": "2021-09-13T22:42:42.000000Z",
|
||||
"language": "eng",
|
||||
"handler_name": "Commentary",
|
||||
"vendor_id": "[0][0][0][0]"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 3,
|
||||
"codec_name": "dvd_subtitle",
|
||||
"codec_long_name": "DVD subtitles",
|
||||
"codec_type": "subtitle",
|
||||
"codec_tag_string": "mp4s",
|
||||
"codec_tag": "0x7334706d",
|
||||
"width": 720,
|
||||
"height": 480,
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/90000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"duration_ts": 1300301588,
|
||||
"duration": "14447.795422",
|
||||
"bit_rate": "2653",
|
||||
"nb_frames": "3545",
|
||||
"disposition": {
|
||||
"default": 0,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
},
|
||||
"tags": {
|
||||
"creation_time": "2021-09-13T22:42:42.000000Z",
|
||||
"language": "spa",
|
||||
"handler_name": "SubtitleHandler"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 4,
|
||||
"codec_name": "mov_text",
|
||||
"codec_long_name": "MOV text",
|
||||
"codec_type": "subtitle",
|
||||
"codec_tag_string": "tx3g",
|
||||
"codec_tag": "0x67337874",
|
||||
"width": 853,
|
||||
"height": 51,
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/90000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"duration_ts": 1401339330,
|
||||
"duration": "15570.437000",
|
||||
"bit_rate": "88",
|
||||
"nb_frames": "5079",
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 1,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
},
|
||||
"tags": {
|
||||
"creation_time": "2021-09-13T22:42:42.000000Z",
|
||||
"language": "eng",
|
||||
"handler_name": "SubtitleHandler"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 5,
|
||||
"codec_name": "mov_text",
|
||||
"codec_long_name": "MOV text",
|
||||
"codec_type": "subtitle",
|
||||
"codec_tag_string": "tx3g",
|
||||
"codec_tag": "0x67337874",
|
||||
"width": 853,
|
||||
"height": 51,
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/90000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"duration_ts": 1370580300,
|
||||
"duration": "15228.670000",
|
||||
"bit_rate": "18",
|
||||
"nb_frames": "1563",
|
||||
"disposition": {
|
||||
"default": 0,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
},
|
||||
"tags": {
|
||||
"creation_time": "2021-09-13T22:42:42.000000Z",
|
||||
"language": "eng",
|
||||
"handler_name": "Commentary"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
+133
@@ -0,0 +1,133 @@
|
||||
{
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "h264",
|
||||
"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
|
||||
"profile": "Main",
|
||||
"codec_type": "video",
|
||||
"codec_time_base": "1001/48000",
|
||||
"codec_tag_string": "avc1",
|
||||
"codec_tag": "0x31637661",
|
||||
"width": 1920,
|
||||
"height": 1080,
|
||||
"coded_width": 1920,
|
||||
"coded_height": 1088,
|
||||
"closed_captions": 0,
|
||||
"has_b_frames": 1,
|
||||
"sample_aspect_ratio": "1:1",
|
||||
"display_aspect_ratio": "16:9",
|
||||
"pix_fmt": "yuv420p",
|
||||
"level": 41,
|
||||
"chroma_location": "left",
|
||||
"refs": 1,
|
||||
"is_avc": "true",
|
||||
"nal_length_size": "4",
|
||||
"r_frame_rate": "24000/1001",
|
||||
"avg_frame_rate": "24000/1001",
|
||||
"time_base": "1/24000",
|
||||
"start_pts": 1000,
|
||||
"start_time": "0.041667",
|
||||
"duration_ts": 29095066,
|
||||
"duration": "1212.294417",
|
||||
"bit_rate": "3948341",
|
||||
"bits_per_raw_sample": "8",
|
||||
"nb_frames": "29066",
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
},
|
||||
"tags": {
|
||||
"creation_time": "2020-01-20T13:56:34.000000Z",
|
||||
"language": "eng",
|
||||
"handler_name": "\fVideoHandler",
|
||||
"encoder": "h264"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"codec_name": "ac3",
|
||||
"codec_long_name": "ATSC A/52A (AC-3)",
|
||||
"codec_type": "audio",
|
||||
"codec_time_base": "1/48000",
|
||||
"codec_tag_string": "ac-3",
|
||||
"codec_tag": "0x332d6361",
|
||||
"sample_fmt": "fltp",
|
||||
"sample_rate": "48000",
|
||||
"channels": 2,
|
||||
"channel_layout": "stereo",
|
||||
"bits_per_sample": 0,
|
||||
"dmix_mode": "-1",
|
||||
"ltrt_cmixlev": "-1.000000",
|
||||
"ltrt_surmixlev": "-1.000000",
|
||||
"loro_cmixlev": "-1.000000",
|
||||
"loro_surmixlev": "-1.000000",
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/48000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"duration_ts": 58232832,
|
||||
"duration": "1213.184000",
|
||||
"bit_rate": "224000",
|
||||
"nb_frames": "37912",
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
},
|
||||
"tags": {
|
||||
"creation_time": "2020-01-20T13:56:34.000000Z",
|
||||
"language": "eng",
|
||||
"handler_name": "\fSoundHandler"
|
||||
},
|
||||
"side_data_list": [
|
||||
{
|
||||
"side_data_type": "Audio Service Type"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"format": {
|
||||
"filename": "The Big Bang Theory - S01E17.mp4",
|
||||
"nb_streams": 2,
|
||||
"nb_programs": 0,
|
||||
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
|
||||
"format_long_name": "QuickTime / MOV",
|
||||
"start_time": "0.000000",
|
||||
"duration": "1213.184000",
|
||||
"size": "633084606",
|
||||
"bit_rate": "4174698",
|
||||
"probe_score": 100,
|
||||
"tags": {
|
||||
"major_brand": "mp42",
|
||||
"minor_version": "512",
|
||||
"compatible_brands": "mp42",
|
||||
"creation_time": "2020-01-20T13:56:34.000000Z",
|
||||
"media_type": "9",
|
||||
"season_number": "0",
|
||||
"episode_sort": "0",
|
||||
"hd_video": "0",
|
||||
"iTunMOVI": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"><plist version=\"1.0\"><dict><key>studio</key><string>studio</string><key>cast</key><array><dict><key>name</key><string></string></dict></array><key>directors</key><array><dict><key>name</key><string></string></dict></array><key>producers</key><array><dict><key>name</key><string></string></dict></array><key>codirectors</key><array><dict><key>name</key><string>codirector</string></dict></array><key>screenwriters</key><array><dict><key>name</key><string></string></dict></array></dict></plist>"
|
||||
}
|
||||
}
|
||||
}
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
{
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "h264",
|
||||
"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
|
||||
"profile": "High",
|
||||
"codec_type": "video",
|
||||
"codec_time_base": "1/50",
|
||||
"codec_tag_string": "avc1",
|
||||
"codec_tag": "0x31637661",
|
||||
"width": 1280,
|
||||
"height": 720,
|
||||
"coded_width": 1280,
|
||||
"coded_height": 720,
|
||||
"closed_captions": 0,
|
||||
"has_b_frames": 2,
|
||||
"pix_fmt": "yuv420p",
|
||||
"level": 31,
|
||||
"chroma_location": "left",
|
||||
"refs": 1,
|
||||
"is_avc": "true",
|
||||
"nal_length_size": "4",
|
||||
"r_frame_rate": "25/1",
|
||||
"avg_frame_rate": "25/1",
|
||||
"time_base": "1/12800",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"duration_ts": 3840000,
|
||||
"duration": "300.000000",
|
||||
"bit_rate": "53288",
|
||||
"bits_per_raw_sample": "8",
|
||||
"nb_frames": "7500",
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
},
|
||||
"tags": {
|
||||
"language": "und",
|
||||
"handler_name": "VideoHandler"
|
||||
}
|
||||
}
|
||||
],
|
||||
"format": {
|
||||
"filename": "test-gray.720p.mp4",
|
||||
"nb_streams": 1,
|
||||
"nb_programs": 0,
|
||||
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
|
||||
"format_long_name": "QuickTime / MOV",
|
||||
"start_time": "0.000000",
|
||||
"duration": "300.000000",
|
||||
"size": "2086818",
|
||||
"bit_rate": "55648",
|
||||
"probe_score": 100,
|
||||
"tags": {
|
||||
"major_brand": "isom",
|
||||
"minor_version": "512",
|
||||
"compatible_brands": "isomiso2avc1mp41",
|
||||
"encoder": "Lavf58.20.100"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,209 @@
|
||||
{
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "h264",
|
||||
"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
|
||||
"profile": "High",
|
||||
"codec_type": "video",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"width": 1920,
|
||||
"height": 1080,
|
||||
"coded_width": 1920,
|
||||
"coded_height": 1080,
|
||||
"closed_captions": 0,
|
||||
"film_grain": 0,
|
||||
"has_b_frames": 0,
|
||||
"sample_aspect_ratio": "1:1",
|
||||
"display_aspect_ratio": "16:9",
|
||||
"pix_fmt": "yuv420p",
|
||||
"level": 42,
|
||||
"chroma_location": "left",
|
||||
"field_order": "progressive",
|
||||
"refs": 1,
|
||||
"is_avc": "true",
|
||||
"nal_length_size": "4",
|
||||
"r_frame_rate": "50/1",
|
||||
"avg_frame_rate": "50/1",
|
||||
"time_base": "1/1000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"bits_per_raw_sample": "8",
|
||||
"extradata_size": 55,
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0,
|
||||
"non_diegetic": 0,
|
||||
"captions": 0,
|
||||
"descriptions": 0,
|
||||
"metadata": 0,
|
||||
"dependent": 0,
|
||||
"still_image": 0
|
||||
},
|
||||
"tags": {
|
||||
"language": "deu",
|
||||
"HANDLER_NAME": "VideoHandler",
|
||||
"VENDOR_ID": "[0][0][0][0]",
|
||||
"BPS": "3950584",
|
||||
"DURATION": "00:00:10.000000000",
|
||||
"NUMBER_OF_FRAMES": "500",
|
||||
"NUMBER_OF_BYTES": "4938231",
|
||||
"_STATISTICS_WRITING_APP": "mkvpropedit v90.0 ('Hanging On') 64-bit",
|
||||
"_STATISTICS_WRITING_DATE_UTC": "2025-04-19 10:37:57",
|
||||
"_STATISTICS_TAGS": "BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"codec_name": "aac",
|
||||
"codec_long_name": "AAC (Advanced Audio Coding)",
|
||||
"profile": "LC",
|
||||
"codec_type": "audio",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"sample_fmt": "fltp",
|
||||
"sample_rate": "48000",
|
||||
"channels": 2,
|
||||
"channel_layout": "stereo",
|
||||
"bits_per_sample": 0,
|
||||
"initial_padding": 0,
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/1000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"extradata_size": 2,
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0,
|
||||
"non_diegetic": 0,
|
||||
"captions": 0,
|
||||
"descriptions": 0,
|
||||
"metadata": 0,
|
||||
"dependent": 0,
|
||||
"still_image": 0
|
||||
},
|
||||
"tags": {
|
||||
"language": "deu",
|
||||
"HANDLER_NAME": "SoundHandler",
|
||||
"VENDOR_ID": "[0][0][0][0]",
|
||||
"BPS": "255785",
|
||||
"DURATION": "00:00:09.984000000",
|
||||
"NUMBER_OF_FRAMES": "469",
|
||||
"NUMBER_OF_BYTES": "319220",
|
||||
"_STATISTICS_WRITING_APP": "mkvpropedit v90.0 ('Hanging On') 64-bit",
|
||||
"_STATISTICS_WRITING_DATE_UTC": "2025-04-19 10:37:57",
|
||||
"_STATISTICS_TAGS": "BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 2,
|
||||
"codec_name": "mjpeg",
|
||||
"codec_long_name": "Motion JPEG",
|
||||
"profile": "Baseline",
|
||||
"codec_type": "video",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"width": 960,
|
||||
"height": 540,
|
||||
"coded_width": 960,
|
||||
"coded_height": 540,
|
||||
"closed_captions": 0,
|
||||
"film_grain": 0,
|
||||
"has_b_frames": 0,
|
||||
"sample_aspect_ratio": "1:1",
|
||||
"display_aspect_ratio": "16:9",
|
||||
"pix_fmt": "yuvj420p",
|
||||
"level": -99,
|
||||
"color_range": "pc",
|
||||
"color_space": "bt470bg",
|
||||
"chroma_location": "center",
|
||||
"refs": 1,
|
||||
"r_frame_rate": "1000/1",
|
||||
"avg_frame_rate": "30000/1",
|
||||
"time_base": "1/1000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"bits_per_raw_sample": "8",
|
||||
"disposition": {
|
||||
"default": 0,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0,
|
||||
"non_diegetic": 0,
|
||||
"captions": 0,
|
||||
"descriptions": 0,
|
||||
"metadata": 0,
|
||||
"dependent": 0,
|
||||
"still_image": 0
|
||||
},
|
||||
"tags": {
|
||||
"BPS": "0",
|
||||
"DURATION": "00:00:00.000011111",
|
||||
"NUMBER_OF_FRAMES": "1",
|
||||
"NUMBER_OF_BYTES": "155034",
|
||||
"_STATISTICS_WRITING_APP": "mkvpropedit v90.0 ('Hanging On') 64-bit",
|
||||
"_STATISTICS_WRITING_DATE_UTC": "2025-04-19 10:37:57",
|
||||
"_STATISTICS_TAGS": "BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES"
|
||||
}
|
||||
}
|
||||
],
|
||||
"chapters": [],
|
||||
"format": {
|
||||
"filename": "file:broken_mkv_covers - 01x03 - statistics added using mkvpropedit.mkv",
|
||||
"nb_streams": 3,
|
||||
"nb_programs": 0,
|
||||
"nb_stream_groups": 0,
|
||||
"format_name": "matroska,webm",
|
||||
"format_long_name": "Matroska / WebM",
|
||||
"start_time": "0.000000",
|
||||
"duration": "10.005000",
|
||||
"size": "5425928",
|
||||
"bit_rate": "4338573",
|
||||
"probe_score": 100,
|
||||
"tags": {
|
||||
"title": "Folge 1: Jackpot Immobilie · Wie wir klug vererben",
|
||||
"EPISODE_SORT": "1",
|
||||
"MAJOR_BRAND": "isom",
|
||||
"MINOR_VERSION": "512",
|
||||
"COMPATIBLE_BRANDS": "isomiso2avc1mp41",
|
||||
"DATE": "20250318",
|
||||
"SEASON_NUMBER": "1",
|
||||
"COMMENT": "https://www.ardmediathek.de/video/Y3JpZDovL2JyLmRlL2Jyb2FkY2FzdC8zZWFmYTcxOC1mZDJmLTRmZTMtYWE4Ny03ZjdlNWViNTk1NDhfb25saW5lYnJvYWRjYXN0",
|
||||
"DESCRIPTION": "Jeder kennt es: Enge Familienmitglieder sprechen plötzlich nicht mehr miteinander, der Streit ums Erbe entzweit die Familie. Was steht im Testament? Kann sich die Erbengemeinschaft einigen? Wie läuft das mit der Erbschaftssteuer und was sagt das Erbrecht?\n\nDas \"Lohnt sich das?\"-Team hat zwei Familien gefunden, die das Tabu rund ums Erben brechen. Sie erzählen, um wie viel Geld es geht, aber auch, was dieses Immobilienerbe mit ihrer Familie gemacht hat. Warum es einmal gelingt, Häuser in Millionenhöhe ohne jegliche Erbschaftssteuer zu vererben, während andere Geschwister sich über ihr Elternhaus komplett zerstritten haben. Erbfolge, Freibeträge, Nießbrauch - für alle Basics rund ums Erben ist Ralph Caspers zuständig, der kompetent erklärt. ",
|
||||
"SYNOPSIS": "Jeder kennt es: Enge Familienmitglieder sprechen plötzlich nicht mehr miteinander, der Streit ums Erbe entzweit die Familie. Was steht im Testament? Kann sich die Erbengemeinschaft einigen? Wie läuft das mit der Erbschaftssteuer und was sagt das Erbrecht?\n\nDas \"Lohnt sich das?\"-Team hat zwei Familien gefunden, die das Tabu rund ums Erben brechen. Sie erzählen, um wie viel Geld es geht, aber auch, was dieses Immobilienerbe mit ihrer Familie gemacht hat. Warum es einmal gelingt, Häuser in Millionenhöhe ohne jegliche Erbschaftssteuer zu vererben, während andere Geschwister sich über ihr Elternhaus komplett zerstritten haben. Erbfolge, Freibeträge, Nießbrauch - für alle Basics rund ums Erben ist Ralph Caspers zuständig, der kompetent erklärt. ",
|
||||
"SHOW": "Generation Wohnkrise. Lohnt sich das?",
|
||||
"EPISODE_ID": "Folge 1: Jackpot Immobilie · Wie wir klug vererben",
|
||||
"ENCODER": "Lavf61.7.100"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
{
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "h264",
|
||||
"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
|
||||
"profile": "Main",
|
||||
"codec_type": "video",
|
||||
"codec_time_base": "1/50",
|
||||
"codec_tag_string": "[27][0][0][0]",
|
||||
"codec_tag": "0x001b",
|
||||
"width": 1920,
|
||||
"height": 1080,
|
||||
"coded_width": 1920,
|
||||
"coded_height": 1080,
|
||||
"has_b_frames": 0,
|
||||
"sample_aspect_ratio": "0:1",
|
||||
"display_aspect_ratio": "0:1",
|
||||
"pix_fmt": "yuvj420p",
|
||||
"level": 42,
|
||||
"color_range": "pc",
|
||||
"color_space": "bt709",
|
||||
"color_transfer": "bt709",
|
||||
"color_primaries": "bt709",
|
||||
"chroma_location": "left",
|
||||
"field_order": "progressive",
|
||||
"refs": 1,
|
||||
"is_avc": "false",
|
||||
"nal_length_size": "0",
|
||||
"id": "0x1",
|
||||
"r_frame_rate": "25/1",
|
||||
"avg_frame_rate": "25/1",
|
||||
"time_base": "1/90000",
|
||||
"start_pts": 8570867078,
|
||||
"start_time": "95231.856422",
|
||||
"duration_ts": 31694552,
|
||||
"duration": "352.161689",
|
||||
"bits_per_raw_sample": "8",
|
||||
"disposition": {
|
||||
"default": 0,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"codec_name": "aac",
|
||||
"codec_long_name": "AAC (Advanced Audio Coding)",
|
||||
"profile": "LC",
|
||||
"codec_type": "audio",
|
||||
"codec_time_base": "1/44100",
|
||||
"codec_tag_string": "[15][0][0][0]",
|
||||
"codec_tag": "0x000f",
|
||||
"sample_fmt": "fltp",
|
||||
"sample_rate": "44100",
|
||||
"channels": 2,
|
||||
"channel_layout": "stereo",
|
||||
"bits_per_sample": 0,
|
||||
"id": "0x2",
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/90000",
|
||||
"start_pts": 8570867697,
|
||||
"start_time": "95231.863300",
|
||||
"duration_ts": 31695687,
|
||||
"duration": "352.174300",
|
||||
"bit_rate": "98191",
|
||||
"disposition": {
|
||||
"default": 0,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0
|
||||
}
|
||||
}
|
||||
],
|
||||
"format": {
|
||||
"filename": "TS Test record.ts",
|
||||
"nb_streams": 2,
|
||||
"nb_programs": 1,
|
||||
"format_name": "mpegts",
|
||||
"format_long_name": "MPEG-TS (MPEG-2 Transport Stream)",
|
||||
"start_time": "95231.856422",
|
||||
"duration": "352.181178",
|
||||
"size": "179003772",
|
||||
"bit_rate": "4066174",
|
||||
"probe_score": 50
|
||||
}
|
||||
}
|
||||
+137
@@ -0,0 +1,137 @@
|
||||
{
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "vp8",
|
||||
"codec_long_name": "On2 VP8",
|
||||
"profile": "1",
|
||||
"codec_type": "video",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"width": 540,
|
||||
"height": 360,
|
||||
"coded_width": 540,
|
||||
"coded_height": 360,
|
||||
"closed_captions": 0,
|
||||
"film_grain": 0,
|
||||
"has_b_frames": 0,
|
||||
"sample_aspect_ratio": "1:1",
|
||||
"display_aspect_ratio": "3:2",
|
||||
"pix_fmt": "yuv420p",
|
||||
"level": -99,
|
||||
"field_order": "progressive",
|
||||
"refs": 1,
|
||||
"r_frame_rate": "2997/125",
|
||||
"avg_frame_rate": "2997/125",
|
||||
"time_base": "1/1000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0,
|
||||
"captions": 0,
|
||||
"descriptions": 0,
|
||||
"metadata": 0,
|
||||
"dependent": 0,
|
||||
"still_image": 0
|
||||
},
|
||||
"tags": {
|
||||
"language": "eng"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"codec_name": "vorbis",
|
||||
"codec_long_name": "Vorbis",
|
||||
"codec_type": "audio",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"sample_fmt": "fltp",
|
||||
"sample_rate": "44100",
|
||||
"channels": 2,
|
||||
"channel_layout": "stereo",
|
||||
"bits_per_sample": 0,
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/1000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"duration": "117.707000",
|
||||
"bit_rate": "127998",
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0,
|
||||
"captions": 0,
|
||||
"descriptions": 0,
|
||||
"metadata": 0,
|
||||
"dependent": 0,
|
||||
"still_image": 0
|
||||
},
|
||||
"tags": {
|
||||
"language": "eng"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 2,
|
||||
"codec_name": "subrip",
|
||||
"codec_long_name": "SubRip subtitle",
|
||||
"codec_type": "subtitle",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"disposition": {
|
||||
"default": 0,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0,
|
||||
"captions": 0,
|
||||
"descriptions": 0,
|
||||
"metadata": 0,
|
||||
"dependent": 0,
|
||||
"still_image": 0
|
||||
},
|
||||
"tags": {
|
||||
"language": "eng"
|
||||
}
|
||||
}
|
||||
],
|
||||
"format": {
|
||||
"filename": "sample.mkv",
|
||||
"nb_streams": 3,
|
||||
"nb_programs": 0,
|
||||
"format_name": "matroska,webm",
|
||||
"format_long_name": "Matroska / WebM",
|
||||
"start_time": "0.000000",
|
||||
"duration": "117.700914",
|
||||
"size": "8566268",
|
||||
"bit_rate": "582239",
|
||||
"probe_score": 100
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
{
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "vp8",
|
||||
"codec_long_name": "On2 VP8",
|
||||
"profile": "1",
|
||||
"codec_type": "video",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"width": 540,
|
||||
"height": 360,
|
||||
"coded_width": 540,
|
||||
"coded_height": 360,
|
||||
"closed_captions": 0,
|
||||
"film_grain": 0,
|
||||
"has_b_frames": 0,
|
||||
"sample_aspect_ratio": "1:1",
|
||||
"display_aspect_ratio": "3:2",
|
||||
"pix_fmt": "yuv420p",
|
||||
"level": -99,
|
||||
"field_order": "progressive",
|
||||
"refs": 1,
|
||||
"r_frame_rate": "2997/125",
|
||||
"avg_frame_rate": "2997/125",
|
||||
"time_base": "1/1000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0,
|
||||
"captions": 0,
|
||||
"descriptions": 0,
|
||||
"metadata": 0,
|
||||
"dependent": 0,
|
||||
"still_image": 0
|
||||
},
|
||||
"tags": {
|
||||
"language": "eng"
|
||||
}
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"codec_name": "vorbis",
|
||||
"codec_long_name": "Vorbis",
|
||||
"codec_type": "audio",
|
||||
"codec_tag_string": "[0][0][0][0]",
|
||||
"codec_tag": "0x0000",
|
||||
"sample_fmt": "fltp",
|
||||
"sample_rate": "44100",
|
||||
"channels": 1,
|
||||
"channel_layout": "mono",
|
||||
"bits_per_sample": 0,
|
||||
"r_frame_rate": "0/0",
|
||||
"avg_frame_rate": "0/0",
|
||||
"time_base": "1/1000",
|
||||
"start_pts": 0,
|
||||
"start_time": "0.000000",
|
||||
"extradata_size": 3097,
|
||||
"disposition": {
|
||||
"default": 1,
|
||||
"dub": 0,
|
||||
"original": 0,
|
||||
"comment": 0,
|
||||
"lyrics": 0,
|
||||
"karaoke": 0,
|
||||
"forced": 0,
|
||||
"hearing_impaired": 0,
|
||||
"visual_impaired": 0,
|
||||
"clean_effects": 0,
|
||||
"attached_pic": 0,
|
||||
"timed_thumbnails": 0,
|
||||
"captions": 0,
|
||||
"descriptions": 0,
|
||||
"metadata": 0,
|
||||
"dependent": 0,
|
||||
"still_image": 0
|
||||
},
|
||||
"tags": {
|
||||
"language": "eng"
|
||||
}
|
||||
}
|
||||
],
|
||||
"format": {
|
||||
"filename": "sample.webm",
|
||||
"nb_streams": 2,
|
||||
"nb_programs": 0,
|
||||
"format_name": "matroska,webm",
|
||||
"format_long_name": "Matroska / WebM",
|
||||
"start_time": "0.000000",
|
||||
"duration": "117.700914",
|
||||
"size": "8566268",
|
||||
"bit_rate": "582239",
|
||||
"probe_score": 100
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
[Script Info]
|
||||
; Script generated by Aegisub
|
||||
; http://www.aegisub.org
|
||||
Title: Neon Genesis Evangelion - Episode 26 (neutral Spanish)
|
||||
Original Script: RoRo
|
||||
Script Updated By: version 2.8.01
|
||||
ScriptType: v4.00+
|
||||
Collisions: Normal
|
||||
PlayResY: 600
|
||||
PlayDepth: 0
|
||||
Timer: 100,0000
|
||||
Video Aspect Ratio: 0
|
||||
Video Zoom: 6
|
||||
Video Position: 0
|
||||
|
||||
[V4+ Styles]
|
||||
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
|
||||
Style: DefaultVCD, Arial,28,&H00B4FCFC,&H00B4FCFC,&H00000008,&H80000008,-1,0,0,0,100,100,0.00,0.00,1,1.00,2.00,2,30,30,30,0
|
||||
|
||||
[Events]
|
||||
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
|
||||
Dialogue: 0,0:00:01.18,0:00:06.85,DefaultVCD, NTP,0000,0000,0000,,{\pos(400,570)}Like an Angel with pity on nobody\NThe second line in subtitle
|
||||
@@ -0,0 +1,8 @@
|
||||
1
|
||||
00:02:17,440 --> 00:02:20,375
|
||||
Senator, we're making
|
||||
our final approach into Coruscant.
|
||||
|
||||
2
|
||||
00:02:20,476 --> 00:02:22,501
|
||||
Very good, Lieutenant.
|
||||
@@ -0,0 +1,20 @@
|
||||
[Script Info]
|
||||
; This is a Sub Station Alpha v4 script.
|
||||
; For Sub Station Alpha info and downloads,
|
||||
; go to http://www.eswat.demon.co.uk/
|
||||
Title: Neon Genesis Evangelion - Episode 26 (neutral Spanish)
|
||||
Original Script: RoRo
|
||||
Script Updated By: version 2.8.01
|
||||
ScriptType: v4.00
|
||||
Collisions: Normal
|
||||
PlayResY: 600
|
||||
PlayDepth: 0
|
||||
Timer: 100,0000
|
||||
|
||||
[V4 Styles]
|
||||
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
|
||||
Style: DefaultVCD, Arial,28,11861244,11861244,11861244,-2147483640,-1,0,1,1,2,2,30,30,30,0,0
|
||||
|
||||
[Events]
|
||||
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
|
||||
Dialogue: Marked=0,0:00:01.18,0:00:06.85,DefaultVCD, NTP,0000,0000,0000,,{\pos(400,570)}Like an angel with pity on nobody
|
||||
@@ -0,0 +1,11 @@
|
||||
311
|
||||
00:16:46,465 --> 00:16:49,009
|
||||
Una vez que la gente se entere
|
||||
|
||||
de que ustedes están aquí,
|
||||
|
||||
312
|
||||
00:16:49,092 --> 00:16:51,470
|
||||
este lugar se convertirá
|
||||
|
||||
en un maldito zoológico.
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
+4
@@ -0,0 +1,4 @@
|
||||
// <autogenerated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")]
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("Jellyfin.MediaEncoding.Tests")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("Jellyfin.MediaEncoding.Tests")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("Jellyfin.MediaEncoding.Tests")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
// Generated by the MSBuild WriteCodeFragment class.
|
||||
|
||||
+1
@@ -0,0 +1 @@
|
||||
ea13e77cd0e1806da4be7490eb07e12ff952d529cffb01991e7ef11bb1d9e18f
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
is_global = true
|
||||
build_property.TargetFramework = net10.0
|
||||
build_property.TargetFramework = net10.0
|
||||
build_property.TargetFrameworkIdentifier = .NETCoreApp
|
||||
build_property.TargetFrameworkIdentifier = .NETCoreApp
|
||||
build_property.TargetFrameworkVersion = v10.0
|
||||
build_property.TargetFrameworkVersion = v10.0
|
||||
build_property.TargetPlatformMinVersion =
|
||||
build_property.TargetPlatformMinVersion =
|
||||
build_property.UsingMicrosoftNETSdkWeb =
|
||||
build_property.UsingMicrosoftNETSdkWeb =
|
||||
build_property.ProjectTypeGuids =
|
||||
build_property.ProjectTypeGuids =
|
||||
build_property.InvariantGlobalization =
|
||||
build_property.InvariantGlobalization =
|
||||
build_property.PlatformNeutralAssembly =
|
||||
build_property.PlatformNeutralAssembly =
|
||||
build_property.EnforceExtendedAnalyzerRules =
|
||||
build_property.EnforceExtendedAnalyzerRules =
|
||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||
build_property.RootNamespace = Jellyfin.MediaEncoding.Tests
|
||||
build_property.ProjectDir = /srv/common_drive/Projects/pgsql-jellyfin/tests/Jellyfin.MediaEncoding.Tests/
|
||||
build_property.EnableComHosting =
|
||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||
build_property.EffectiveAnalysisLevelStyle = 10.0
|
||||
build_property.EnableCodeStyleSeverity =
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
+5277
File diff suppressed because it is too large
Load Diff
+31
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/wjones/.nuget/packages/</NuGetPackageRoot>
|
||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/wjones/.nuget/packages/</NuGetPackageFolders>
|
||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<SourceRoot Include="/home/wjones/.nuget/packages/" />
|
||||
</ItemGroup>
|
||||
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<Import Project="$(NuGetPackageRoot)xunit.runner.visualstudio/2.8.2/build/net6.0/xunit.runner.visualstudio.props" Condition="Exists('$(NuGetPackageRoot)xunit.runner.visualstudio/2.8.2/build/net6.0/xunit.runner.visualstudio.props')" />
|
||||
<Import Project="$(NuGetPackageRoot)xunit.core/2.9.3/build/xunit.core.props" Condition="Exists('$(NuGetPackageRoot)xunit.core/2.9.3/build/xunit.core.props')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.testplatform.testhost/18.0.1/build/net8.0/Microsoft.TestPlatform.TestHost.props" Condition="Exists('$(NuGetPackageRoot)microsoft.testplatform.testhost/18.0.1/build/net8.0/Microsoft.TestPlatform.TestHost.props')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.codecoverage/18.0.1/build/netstandard2.0/Microsoft.CodeCoverage.props" Condition="Exists('$(NuGetPackageRoot)microsoft.codecoverage/18.0.1/build/netstandard2.0/Microsoft.CodeCoverage.props')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.net.test.sdk/18.0.1/build/net8.0/Microsoft.NET.Test.Sdk.props" Condition="Exists('$(NuGetPackageRoot)microsoft.net.test.sdk/18.0.1/build/net8.0/Microsoft.NET.Test.Sdk.props')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.entityframeworkcore/10.0.3/buildTransitive/net10.0/Microsoft.EntityFrameworkCore.props" Condition="Exists('$(NuGetPackageRoot)microsoft.entityframeworkcore/10.0.3/buildTransitive/net10.0/Microsoft.EntityFrameworkCore.props')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.codeanalysis.bannedapianalyzers/4.14.0/buildTransitive/Microsoft.CodeAnalysis.BannedApiAnalyzers.props" Condition="Exists('$(NuGetPackageRoot)microsoft.codeanalysis.bannedapianalyzers/4.14.0/buildTransitive/Microsoft.CodeAnalysis.BannedApiAnalyzers.props')" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<Pkgxunit_analyzers Condition=" '$(Pkgxunit_analyzers)' == '' ">/home/wjones/.nuget/packages/xunit.analyzers/1.18.0</Pkgxunit_analyzers>
|
||||
<PkgStyleCop_Analyzers_Unstable Condition=" '$(PkgStyleCop_Analyzers_Unstable)' == '' ">/home/wjones/.nuget/packages/stylecop.analyzers.unstable/1.2.0.556</PkgStyleCop_Analyzers_Unstable>
|
||||
<PkgSmartAnalyzers_MultithreadingAnalyzer Condition=" '$(PkgSmartAnalyzers_MultithreadingAnalyzer)' == '' ">/home/wjones/.nuget/packages/smartanalyzers.multithreadinganalyzer/1.1.31</PkgSmartAnalyzers_MultithreadingAnalyzer>
|
||||
<PkgSerilogAnalyzer Condition=" '$(PkgSerilogAnalyzer)' == '' ">/home/wjones/.nuget/packages/seriloganalyzer/0.15.0</PkgSerilogAnalyzer>
|
||||
<PkgMicrosoft_CodeAnalysis_BannedApiAnalyzers Condition=" '$(PkgMicrosoft_CodeAnalysis_BannedApiAnalyzers)' == '' ">/home/wjones/.nuget/packages/microsoft.codeanalysis.bannedapianalyzers/4.14.0</PkgMicrosoft_CodeAnalysis_BannedApiAnalyzers>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<Import Project="$(NuGetPackageRoot)xunit.core/2.9.3/build/xunit.core.targets" Condition="Exists('$(NuGetPackageRoot)xunit.core/2.9.3/build/xunit.core.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.testplatform.testhost/18.0.1/build/net8.0/Microsoft.TestPlatform.TestHost.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.testplatform.testhost/18.0.1/build/net8.0/Microsoft.TestPlatform.TestHost.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.codecoverage/18.0.1/build/netstandard2.0/Microsoft.CodeCoverage.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.codecoverage/18.0.1/build/netstandard2.0/Microsoft.CodeCoverage.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.net.test.sdk/18.0.1/build/net8.0/Microsoft.NET.Test.Sdk.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.net.test.sdk/18.0.1/build/net8.0/Microsoft.NET.Test.Sdk.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.options/10.0.3/buildTransitive/net8.0/Microsoft.Extensions.Options.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.options/10.0.3/buildTransitive/net8.0/Microsoft.Extensions.Options.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.configuration.binder/10.0.3/buildTransitive/netstandard2.0/Microsoft.Extensions.Configuration.Binder.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.configuration.binder/10.0.3/buildTransitive/netstandard2.0/Microsoft.Extensions.Configuration.Binder.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions/10.0.3/buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions/10.0.3/buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.codeanalysis.bannedapianalyzers/4.14.0/buildTransitive/Microsoft.CodeAnalysis.BannedApiAnalyzers.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.codeanalysis.bannedapianalyzers/4.14.0/buildTransitive/Microsoft.CodeAnalysis.BannedApiAnalyzers.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)coverlet.collector/8.0.0/build/net8.0/coverlet.collector.targets" Condition="Exists('$(NuGetPackageRoot)coverlet.collector/8.0.0/build/net8.0/coverlet.collector.targets')" />
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"version": 2,
|
||||
"dgSpecHash": "L5zu7+X1dEg=",
|
||||
"success": true,
|
||||
"projectFilePath": "/srv/common_drive/Projects/pgsql-jellyfin/tests/Jellyfin.MediaEncoding.Tests/Jellyfin.MediaEncoding.Tests.csproj",
|
||||
"expectedPackageFiles": [
|
||||
"/home/wjones/.nuget/packages/asynckeyedlock/8.0.2/asynckeyedlock.8.0.2.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/autofixture/4.18.1/autofixture.4.18.1.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/autofixture.automoq/4.18.1/autofixture.automoq.4.18.1.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/autofixture.xunit2/4.18.1/autofixture.xunit2.4.18.1.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/bdinfo/0.8.0/bdinfo.0.8.0.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/bitfaster.caching/2.5.4/bitfaster.caching.2.5.4.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/castle.core/5.1.1/castle.core.5.1.1.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/coverlet.collector/8.0.0/coverlet.collector.8.0.0.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/diacritics/4.1.4/diacritics.4.1.4.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/fare/2.1.1/fare.2.1.1.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/icu4n/60.1.0-alpha.356/icu4n.60.1.0-alpha.356.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/icu4n.transliterator/60.1.0-alpha.356/icu4n.transliterator.60.1.0-alpha.356.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/j2n/2.0.0/j2n.2.0.0.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/libse/4.0.12/libse.4.0.12.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.codeanalysis.bannedapianalyzers/4.14.0/microsoft.codeanalysis.bannedapianalyzers.4.14.0.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.codecoverage/18.0.1/microsoft.codecoverage.18.0.1.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.entityframeworkcore/10.0.3/microsoft.entityframeworkcore.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.entityframeworkcore.abstractions/10.0.3/microsoft.entityframeworkcore.abstractions.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.entityframeworkcore.analyzers/10.0.3/microsoft.entityframeworkcore.analyzers.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.entityframeworkcore.relational/10.0.3/microsoft.entityframeworkcore.relational.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.caching.abstractions/10.0.3/microsoft.extensions.caching.abstractions.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.caching.memory/10.0.3/microsoft.extensions.caching.memory.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.configuration/10.0.3/microsoft.extensions.configuration.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.configuration.abstractions/10.0.3/microsoft.extensions.configuration.abstractions.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.configuration.binder/10.0.3/microsoft.extensions.configuration.binder.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.dependencyinjection/10.0.3/microsoft.extensions.dependencyinjection.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.dependencyinjection.abstractions/10.0.3/microsoft.extensions.dependencyinjection.abstractions.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.diagnostics/10.0.3/microsoft.extensions.diagnostics.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.diagnostics.abstractions/10.0.3/microsoft.extensions.diagnostics.abstractions.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.http/10.0.3/microsoft.extensions.http.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.logging/10.0.3/microsoft.extensions.logging.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.logging.abstractions/10.0.3/microsoft.extensions.logging.abstractions.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.options/10.0.3/microsoft.extensions.options.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.options.configurationextensions/10.0.3/microsoft.extensions.options.configurationextensions.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.extensions.primitives/10.0.3/microsoft.extensions.primitives.10.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.net.test.sdk/18.0.1/microsoft.net.test.sdk.18.0.1.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.netcore.platforms/1.1.0/microsoft.netcore.platforms.1.1.0.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.testplatform.objectmodel/18.0.1/microsoft.testplatform.objectmodel.18.0.1.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.testplatform.testhost/18.0.1/microsoft.testplatform.testhost.18.0.1.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/microsoft.win32.systemevents/9.0.2/microsoft.win32.systemevents.9.0.2.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/moq/4.18.4/moq.4.18.4.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/nebml/1.1.0.5/nebml.1.1.0.5.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/netstandard.library/1.6.1/netstandard.library.1.6.1.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/newtonsoft.json/13.0.3/newtonsoft.json.13.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/polly/8.6.5/polly.8.6.5.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/polly.core/8.6.5/polly.core.8.6.5.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/seriloganalyzer/0.15.0/seriloganalyzer.0.15.0.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/smartanalyzers.multithreadinganalyzer/1.1.31/smartanalyzers.multithreadinganalyzer.1.1.31.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/stylecop.analyzers/1.2.0-beta.556/stylecop.analyzers.1.2.0-beta.556.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/stylecop.analyzers.unstable/1.2.0.556/stylecop.analyzers.unstable.1.2.0.556.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/system.diagnostics.eventlog/6.0.0/system.diagnostics.eventlog.6.0.0.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/system.drawing.common/9.0.2/system.drawing.common.9.0.2.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/utf.unknown/2.6.0/utf.unknown.2.6.0.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/xunit/2.9.3/xunit.2.9.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/xunit.abstractions/2.0.3/xunit.abstractions.2.0.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/xunit.analyzers/1.18.0/xunit.analyzers.1.18.0.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/xunit.assert/2.9.3/xunit.assert.2.9.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/xunit.core/2.9.3/xunit.core.2.9.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/xunit.extensibility.core/2.9.3/xunit.extensibility.core.2.9.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/xunit.extensibility.execution/2.9.3/xunit.extensibility.execution.2.9.3.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/xunit.runner.visualstudio/2.8.2/xunit.runner.visualstudio.2.8.2.nupkg.sha512",
|
||||
"/home/wjones/.nuget/packages/zlib.net-mutliplatform/1.0.8/zlib.net-mutliplatform.1.0.8.nupkg.sha512"
|
||||
],
|
||||
"logs": []
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
17714532033100000
|
||||
@@ -0,0 +1 @@
|
||||
17715044192400000
|
||||
Reference in New Issue
Block a user