mirror of
https://github.com/gabehf/Tdarr_Plugins.git
synced 2026-03-18 11:46:25 -07:00
commit
f8f5172765
41 changed files with 2307 additions and 154 deletions
23
.github/workflows/lint.yml
vendored
23
.github/workflows/lint.yml
vendored
|
|
@ -1,23 +0,0 @@
|
||||||
name: Node.js CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches: ['**']
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [16.x]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
|
||||||
uses: actions/setup-node@v1
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node-version }}
|
|
||||||
- run: npm i
|
|
||||||
- run: npm run checkPlugins && npm run lint && npm run test
|
|
||||||
34
.github/workflows/lint_and_test.yml
vendored
Normal file
34
.github/workflows/lint_and_test.yml
vendored
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
name: Node.js CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: ['**']
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [16.x]
|
||||||
|
os:
|
||||||
|
[
|
||||||
|
["ubuntu-20.04"],
|
||||||
|
["windows-2019"],
|
||||||
|
["macos-11.0"],
|
||||||
|
]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Set git to use LF
|
||||||
|
run: |
|
||||||
|
git config --global core.autocrlf false
|
||||||
|
git config --global core.eol lf
|
||||||
|
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
- run: npm i
|
||||||
|
- run: npm run checkPlugins
|
||||||
|
- run: npm run lint
|
||||||
|
- run: npm run test
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
// https://github.com/HaveAGitGat/Tdarr_Plugins/blob/master/Community/Tdarr_Plugin_MC93_Migz1FFMPEG.js
|
// https://github.com/HaveAGitGat/Tdarr_Plugins/blob/master/Community/Tdarr_Plugin_MC93_Migz1FFMPEG.js
|
||||||
// Seriously, all I did was make it work for converting things to h264 instead of hevc
|
// Seriously, all I did was make it work for converting things to h264 instead of hevc
|
||||||
|
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => ({
|
const details = () => ({
|
||||||
id: 'Tdarr_Plugin_SV6x_Smoove1FFMPEG_NVENC_H264',
|
id: 'Tdarr_Plugin_SV6x_Smoove1FFMPEG_NVENC_H264',
|
||||||
Stage: 'Pre-processing', // Preprocessing or Post-processing. Determines when the plugin will be executed.
|
Stage: 'Pre-processing', // Preprocessing or Post-processing. Determines when the plugin will be executed.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
/* eslint max-classes-per-file: ["error", 2] */
|
/* eslint max-classes-per-file: ["error", 2] */
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => ({
|
const details = () => ({
|
||||||
id: 'Tdarr_Plugin_VP92_VP9_Match_Bitrate_One_Pass',
|
id: 'Tdarr_Plugin_VP92_VP9_Match_Bitrate_One_Pass',
|
||||||
Stage: 'Pre-processing',
|
Stage: 'Pre-processing',
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
// eslint-disable-next-line import/no-unresolved
|
// eslint-disable-next-line import/no-unresolved
|
||||||
|
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => ({
|
const details = () => ({
|
||||||
id: 'Tdarr_Plugin_a9hf_New_file_duration_check',
|
id: 'Tdarr_Plugin_a9hf_New_file_duration_check',
|
||||||
Stage: 'Pre-processing',
|
Stage: 'Pre-processing',
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => {
|
const details = () => {
|
||||||
return {
|
return {
|
||||||
id: "Tdarr_Plugin_s710_nick_h265_nvenc_4K",
|
id: "Tdarr_Plugin_s710_nick_h265_nvenc_4K",
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => {
|
const details = () => {
|
||||||
return {
|
return {
|
||||||
id: "Tdarr_Plugin_s7x9_winsome_h265_10bit",
|
id: "Tdarr_Plugin_s7x9_winsome_h265_10bit",
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => {
|
const details = () => {
|
||||||
return {
|
return {
|
||||||
id: "Tdarr_Plugin_s7x9_winsome_h265_nvenc",
|
id: "Tdarr_Plugin_s7x9_winsome_h265_nvenc",
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => {
|
const details = () => {
|
||||||
return {
|
return {
|
||||||
id: "Tdarr_Plugin_sdd3_Remove_Commentary_Tracks",
|
id: "Tdarr_Plugin_sdd3_Remove_Commentary_Tracks",
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => {
|
const details = () => {
|
||||||
return {
|
return {
|
||||||
id: "Tdarr_Plugin_sdf5_Thierrrrry_Remove_Non_English_Audio",
|
id: "Tdarr_Plugin_sdf5_Thierrrrry_Remove_Non_English_Audio",
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => {
|
const details = () => {
|
||||||
return {
|
return {
|
||||||
id: "Tdarr_Plugin_vdka_Remove_DataStreams",
|
id: "Tdarr_Plugin_vdka_Remove_DataStreams",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => ({
|
const details = () => ({
|
||||||
id: 'Tdarr_Plugin_vdka_Tiered_CPU_CRF_Based_Configurable',
|
id: 'Tdarr_Plugin_vdka_Tiered_CPU_CRF_Based_Configurable',
|
||||||
Stage: 'Pre-processing',
|
Stage: 'Pre-processing',
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => {
|
const details = () => {
|
||||||
return {
|
return {
|
||||||
id: 'Tdarr_Plugin_vdka_Tiered_NVENC_CQV_BASED_CONFIGURABLE',
|
id: 'Tdarr_Plugin_vdka_Tiered_NVENC_CQV_BASED_CONFIGURABLE',
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => {
|
const details = () => {
|
||||||
return {
|
return {
|
||||||
id: "Tdarr_Plugin_x7ab_Remove_Subs",
|
id: "Tdarr_Plugin_x7ab_Remove_Subs",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => ({
|
const details = () => ({
|
||||||
id: 'Tdarr_Plugin_x7ac_Remove_Closed_Captions',
|
id: 'Tdarr_Plugin_x7ac_Remove_Closed_Captions',
|
||||||
Stage: 'Pre-processing',
|
Stage: 'Pre-processing',
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => ({
|
const details = () => ({
|
||||||
id: 'Tdarr_Plugin_z0ab_TheRealShadoh_FFmpeg_Subs_H264_Medium',
|
id: 'Tdarr_Plugin_z0ab_TheRealShadoh_FFmpeg_Subs_H264_Medium',
|
||||||
Stage: 'Pre-processing',
|
Stage: 'Pre-processing',
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => ({
|
const details = () => ({
|
||||||
id: 'Tdarr_Plugin_z1ab_TheRealShadoh_FFmpeg_Subs_H264_Fast',
|
id: 'Tdarr_Plugin_z1ab_TheRealShadoh_FFmpeg_Subs_H264_Fast',
|
||||||
Stage: 'Pre-processing',
|
Stage: 'Pre-processing',
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => ({
|
const details = () => ({
|
||||||
id: 'Tdarr_Plugin_z2ab_TheRealShadoh_FFmpeg_Subs_H264_Slow',
|
id: 'Tdarr_Plugin_z2ab_TheRealShadoh_FFmpeg_Subs_H264_Slow',
|
||||||
Stage: 'Pre-processing',
|
Stage: 'Pre-processing',
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
// tdarrSkipTest
|
|
||||||
const details = () => ({
|
const details = () => ({
|
||||||
id: 'Tdarr_Plugin_z3ab_TheRealShadoh_FFmpeg_Subs_H264_VeryFast',
|
id: 'Tdarr_Plugin_z3ab_TheRealShadoh_FFmpeg_Subs_H264_VeryFast',
|
||||||
Stage: 'Pre-processing',
|
Stage: 'Pre-processing',
|
||||||
|
|
|
||||||
|
|
@ -11,17 +11,33 @@ const tests = [
|
||||||
otherArguments: {},
|
otherArguments: {},
|
||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
container: '.mkv',
|
win32: {
|
||||||
processFile: true,
|
container: '.mkv',
|
||||||
preset: ', -sn -map 0:v -c:v copy -b:v 758k -minrate 530k -maxrate 985k -bufsize 1517k -map 0:a -c:a copy ',
|
processFile: true,
|
||||||
handBrakeMode: false,
|
preset: ', -sn -map 0:v -c:v hevc_qsv -load_plugin hevc_hw -b:v 758k -minrate 530k -maxrate 985k -bufsize 1517k -map 0:a -c:a copy ',
|
||||||
FFmpegMode: true,
|
handBrakeMode: false,
|
||||||
reQueueAfter: true,
|
FFmpegMode: true,
|
||||||
infoLog: 'Converting video, NOT resizing. 720p, h264 --> 720p, hevc. bitrate = 1517 --> 758, multiplier 0.5. \n'
|
reQueueAfter: true,
|
||||||
+ 'Not converting audio. \n'
|
infoLog: 'Converting video, NOT resizing. 720p, h264 --> 720p, hevc. bitrate = 1517 --> 758, multiplier 0.5. \n'
|
||||||
+ '2 channels - \n'
|
+ 'Not converting audio. \n'
|
||||||
+ '6 channels - und aac \n'
|
+ '2 channels - \n'
|
||||||
+ '8 channels - ',
|
+ '6 channels - und aac \n'
|
||||||
|
+ '8 channels - ',
|
||||||
|
},
|
||||||
|
linux: false,
|
||||||
|
darwin: {
|
||||||
|
container: '.mkv',
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -sn -map 0:v -c:v hevc_videotoolbox -profile main -b:v 758k -minrate 530k -maxrate 985k -bufsize 1517k -map 0:a -c:a copy ',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: 'Converting video, NOT resizing. 720p, h264 --> 720p, hevc. bitrate = 1517 --> 758, multiplier 0.5. \n'
|
||||||
|
+ 'Not converting audio. \n'
|
||||||
|
+ '2 channels - \n'
|
||||||
|
+ '6 channels - und aac \n'
|
||||||
|
+ '8 channels - ',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -70,17 +86,33 @@ const tests = [
|
||||||
otherArguments: {},
|
otherArguments: {},
|
||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
container: '.mkv',
|
win32: {
|
||||||
processFile: true,
|
container: '.mkv',
|
||||||
preset: ', -sn -map 0:v -c:v copy -b:v 3933k -minrate 2753k -maxrate 5112k -bufsize 7866k -map 0:a -c:a copy ',
|
processFile: true,
|
||||||
handBrakeMode: false,
|
preset: ', -sn -map 0:v -c:v hevc_qsv -load_plugin hevc_hw -b:v 3933k -minrate 2753k -maxrate 5112k -bufsize 7866k -map 0:a -c:a copy ',
|
||||||
FFmpegMode: true,
|
handBrakeMode: false,
|
||||||
reQueueAfter: true,
|
FFmpegMode: true,
|
||||||
infoLog: 'Converting video, NOT resizing. 1080p, h264 --> 1080p, hevc. bitrate = 7866 --> 3933, multiplier 0.5. \n'
|
reQueueAfter: true,
|
||||||
+ 'Not converting audio. \n'
|
infoLog: 'Converting video, NOT resizing. 1080p, h264 --> 1080p, hevc. bitrate = 7866 --> 3933, multiplier 0.5. \n'
|
||||||
+ '2 channels - eng flac \n'
|
+ 'Not converting audio. \n'
|
||||||
+ '6 channels - \n'
|
+ '2 channels - eng flac \n'
|
||||||
+ '8 channels - ',
|
+ '6 channels - \n'
|
||||||
|
+ '8 channels - ',
|
||||||
|
},
|
||||||
|
linux: false,
|
||||||
|
darwin: {
|
||||||
|
container: '.mkv',
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -sn -map 0:v -c:v hevc_videotoolbox -profile main -b:v 3933k -minrate 2753k -maxrate 5112k -bufsize 7866k -map 0:a -c:a copy ',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: 'Converting video, NOT resizing. 1080p, h264 --> 1080p, hevc. bitrate = 7866 --> 3933, multiplier 0.5. \n'
|
||||||
|
+ 'Not converting audio. \n'
|
||||||
|
+ '2 channels - eng flac \n'
|
||||||
|
+ '6 channels - \n'
|
||||||
|
+ '8 channels - ',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
106
tests/Community/Tdarr_Plugin_SV6x_Smoove1FFMPEG_NVENC_H264.js
Normal file
106
tests/Community/Tdarr_Plugin_SV6x_Smoove1FFMPEG_NVENC_H264.js
Normal file
|
|
@ -0,0 +1,106 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
infoLog: 'File is already H264 but file is not in mkv. Remuxing \n',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
container: '.mkv',
|
||||||
|
preset: ', -map 0 -c copy ',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.container = 'mkv';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
infoLog: 'File is already H264 and in mkv \n',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
container: '.mkv',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH265_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
infoLog: 'Target bitrate could not be calculated. Skipping this plugin. \n',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
container: '.mkv',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.ffProbeData.streams[0].codec_name = 'hevc';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
infoLog: 'Container for output selected as mkv. \n'
|
||||||
|
+ 'Current bitrate = 1526 \n'
|
||||||
|
+ 'Bitrate settings: \n'
|
||||||
|
+ 'Target = 1526 \n'
|
||||||
|
+ 'Minimum = 1068 \n'
|
||||||
|
+ 'Maximum = 1983 \n'
|
||||||
|
+ 'File is not h264. Transcoding. \n',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
container: '.mkv',
|
||||||
|
preset: 'undefined,-map 0 -c:v h264_nvenc -preset fast -crf 23 -tune film -b:v 1526k -minrate 1068k -maxrate 1983k -bufsize 1526k -c:a copy -c:s copy -max_muxing_queue_size 9999 -pix_fmt yuv420p ',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
container: 'mp4',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
infoLog: 'File is already H264 and in mp4 \n',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
container: '.mp4',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
505
tests/Community/Tdarr_Plugin_VP92_VP9_Match_Bitrate_One_Pass.js
Normal file
505
tests/Community/Tdarr_Plugin_VP92_VP9_Match_Bitrate_One_Pass.js
Normal file
|
|
@ -0,0 +1,505 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
container: '.webm',
|
||||||
|
FFmpegMode: true,
|
||||||
|
handBrakeMode: false,
|
||||||
|
infoLog: '☒ Audio is not in proper codec, will format\n'
|
||||||
|
+ '☒ Transcoding file to VP9\n'
|
||||||
|
+ '☑ No subtitle processing necessary',
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -map -0:d -pix_fmt yuv420p10le -c:v libvpx-vp9 -b:v 0 -crf 27 -threads 64 -speed 2 \n'
|
||||||
|
+ ' -quality good -static-thresh 0 -tile-columns 2 -tile-rows 0 -frame-parallel 0 -row-mt 1 \n'
|
||||||
|
+ ' -aq-mode 0 -g 240 \n'
|
||||||
|
+ ' -c:a libopus -c:s copy',
|
||||||
|
reQueueAfter: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH265_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
container: '.webm',
|
||||||
|
FFmpegMode: true,
|
||||||
|
handBrakeMode: false,
|
||||||
|
infoLog: '☒ Audio is not in proper codec, will format\n'
|
||||||
|
+ '☒ Transcoding file to VP9\n'
|
||||||
|
+ '☑ No subtitle processing necessary',
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -map -0:d -pix_fmt yuv420p10le -c:v libvpx-vp9 -b:v 0 -crf 26 -threads 64 -speed 2 \n'
|
||||||
|
+ ' -quality good -static-thresh 0 -tile-columns 2 -tile-rows 0 -frame-parallel 0 -row-mt 1 \n'
|
||||||
|
+ ' -aq-mode 0 -g 240 \n'
|
||||||
|
+ ' -c:a libopus -c:s copy',
|
||||||
|
reQueueAfter: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.container = 'webm';
|
||||||
|
file.ffProbeData.streams[0].codec_name = 'vp9';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
container: '.webm',
|
||||||
|
FFmpegMode: true,
|
||||||
|
handBrakeMode: false,
|
||||||
|
infoLog: '☒ Audio is not in proper codec, will format\n'
|
||||||
|
+ '☑ File is in proper video format\n'
|
||||||
|
+ '☑ No video processing necessary\n'
|
||||||
|
+ '☑ No subtitle processing necessary',
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -map -0:d -c:v copy \n -c:a libopus -c:s copy',
|
||||||
|
reQueueAfter: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.container = 'webm';
|
||||||
|
file.ffProbeData.streams[0].codec_name = 'vp9';
|
||||||
|
file.ffProbeData.streams[1].codec_name = 'opus';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
container: '.webm',
|
||||||
|
FFmpegMode: true,
|
||||||
|
handBrakeMode: false,
|
||||||
|
infoLog: '☑ No audio processing necessary\n'
|
||||||
|
+ '☑ File is in proper video format\n'
|
||||||
|
+ '☑ No video processing necessary\n'
|
||||||
|
+ '☑ No subtitle processing necessary\n'
|
||||||
|
+ '☑ No need to process file',
|
||||||
|
processFile: false,
|
||||||
|
preset: ',-map 0 -map -0:d -c:v copy \n -c:a copy -c:s copy',
|
||||||
|
reQueueAfter: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
CQ_240p: '33',
|
||||||
|
CQ_360p: '32',
|
||||||
|
CQ_480p: '29',
|
||||||
|
CQ_720p: '28',
|
||||||
|
CQ_1080p: '27',
|
||||||
|
CQ_4KUHD: '16',
|
||||||
|
CQ_8KUHD: '16',
|
||||||
|
audio_language: 'eng,und,fre',
|
||||||
|
audio_commentary: 'true',
|
||||||
|
subtitle_language: 'eng',
|
||||||
|
subtitle_commentary: 'true',
|
||||||
|
remove_mjpeg: 'true',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
container: '.webm',
|
||||||
|
FFmpegMode: true,
|
||||||
|
handBrakeMode: false,
|
||||||
|
infoLog: '☒ Audio is not in proper codec, will format\n'
|
||||||
|
+ '☒ Transcoding file to VP9\n'
|
||||||
|
+ '☑ No subtitle processing necessary',
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -map -0:d -pix_fmt yuv420p10le -c:v libvpx-vp9 -b:v 0 -crf 28 -threads 64 -speed 2 \n'
|
||||||
|
+ ' -quality good -static-thresh 0 -tile-columns 2 -tile-rows 0 -frame-parallel 0 -row-mt 1 \n'
|
||||||
|
+ ' -aq-mode 0 -g 240 \n'
|
||||||
|
+ ' -c:a libopus -c:s copy',
|
||||||
|
reQueueAfter: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '240p';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
CQ_240p: '33',
|
||||||
|
CQ_360p: '32',
|
||||||
|
CQ_480p: '29',
|
||||||
|
CQ_720p: '28',
|
||||||
|
CQ_1080p: '27',
|
||||||
|
CQ_4KUHD: '16',
|
||||||
|
CQ_8KUHD: '16',
|
||||||
|
audio_language: 'eng,und,fre',
|
||||||
|
audio_commentary: 'true',
|
||||||
|
subtitle_language: 'eng',
|
||||||
|
subtitle_commentary: 'true',
|
||||||
|
remove_mjpeg: 'true',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
container: '.webm',
|
||||||
|
FFmpegMode: true,
|
||||||
|
handBrakeMode: false,
|
||||||
|
infoLog: '☒ Audio is not in proper codec, will format\n'
|
||||||
|
+ '☒ Transcoding file to VP9\n'
|
||||||
|
+ '☑ No subtitle processing necessary',
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -map -0:d -pix_fmt yuv420p10le -c:v libvpx-vp9 -b:v 0 -crf 33 -threads 64 -speed 1 \n'
|
||||||
|
+ ' -quality good -static-thresh 0 -tile-columns 0 -tile-rows 0 -frame-parallel 0 -row-mt 1 \n'
|
||||||
|
+ ' -aq-mode 0 -g 240 \n'
|
||||||
|
+ ' -c:a libopus -c:s copy',
|
||||||
|
reQueueAfter: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '360p';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
CQ_240p: '33',
|
||||||
|
CQ_360p: '32',
|
||||||
|
CQ_480p: '29',
|
||||||
|
CQ_720p: '28',
|
||||||
|
CQ_1080p: '27',
|
||||||
|
CQ_4KUHD: '16',
|
||||||
|
CQ_8KUHD: '16',
|
||||||
|
audio_language: 'eng,und,fre',
|
||||||
|
audio_commentary: 'true',
|
||||||
|
subtitle_language: 'eng',
|
||||||
|
subtitle_commentary: 'true',
|
||||||
|
remove_mjpeg: 'true',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
container: '.webm',
|
||||||
|
FFmpegMode: true,
|
||||||
|
handBrakeMode: false,
|
||||||
|
infoLog: '☒ Audio is not in proper codec, will format\n'
|
||||||
|
+ '☒ Transcoding file to VP9\n'
|
||||||
|
+ '☑ No subtitle processing necessary',
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -map -0:d -pix_fmt yuv420p10le -c:v libvpx-vp9 -b:v 0 -crf 32 -threads 64 -speed 1 \n'
|
||||||
|
+ ' -quality good -static-thresh 0 -tile-columns 1 -tile-rows 0 -frame-parallel 0 -row-mt 1 \n'
|
||||||
|
+ ' -aq-mode 0 -g 240 \n'
|
||||||
|
+ ' -c:a libopus -c:s copy',
|
||||||
|
reQueueAfter: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '480p';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
CQ_240p: '33',
|
||||||
|
CQ_360p: '32',
|
||||||
|
CQ_480p: '29',
|
||||||
|
CQ_720p: '28',
|
||||||
|
CQ_1080p: '27',
|
||||||
|
CQ_4KUHD: '16',
|
||||||
|
CQ_8KUHD: '16',
|
||||||
|
audio_language: 'eng,und,fre',
|
||||||
|
audio_commentary: 'true',
|
||||||
|
subtitle_language: 'eng',
|
||||||
|
subtitle_commentary: 'true',
|
||||||
|
remove_mjpeg: 'true',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
container: '.webm',
|
||||||
|
FFmpegMode: true,
|
||||||
|
handBrakeMode: false,
|
||||||
|
infoLog: '☒ Audio is not in proper codec, will format\n'
|
||||||
|
+ '☒ Transcoding file to VP9\n'
|
||||||
|
+ '☑ No subtitle processing necessary',
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -map -0:d -pix_fmt yuv420p10le -c:v libvpx-vp9 -b:v 0 -crf 29 -threads 64 -speed 1 \n'
|
||||||
|
+ ' -quality good -static-thresh 0 -tile-columns 1 -tile-rows 0 -frame-parallel 0 -row-mt 1 \n'
|
||||||
|
+ ' -aq-mode 0 -g 240 \n'
|
||||||
|
+ ' -c:a libopus -c:s copy',
|
||||||
|
reQueueAfter: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '1080p';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
CQ_240p: '33',
|
||||||
|
CQ_360p: '32',
|
||||||
|
CQ_480p: '29',
|
||||||
|
CQ_720p: '28',
|
||||||
|
CQ_1080p: '27',
|
||||||
|
CQ_4KUHD: '16',
|
||||||
|
CQ_8KUHD: '16',
|
||||||
|
audio_language: 'eng,und,fre',
|
||||||
|
audio_commentary: 'true',
|
||||||
|
subtitle_language: 'eng',
|
||||||
|
subtitle_commentary: 'true',
|
||||||
|
remove_mjpeg: 'true',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
container: '.webm',
|
||||||
|
FFmpegMode: true,
|
||||||
|
handBrakeMode: false,
|
||||||
|
infoLog: '☒ Audio is not in proper codec, will format\n'
|
||||||
|
+ '☒ Transcoding file to VP9\n'
|
||||||
|
+ '☑ No subtitle processing necessary',
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -map -0:d -pix_fmt yuv420p10le -c:v libvpx-vp9 -b:v 0 -crf 27 -threads 64 -speed 2 \n'
|
||||||
|
+ ' -quality good -static-thresh 0 -tile-columns 2 -tile-rows 0 -frame-parallel 0 -row-mt 1 \n'
|
||||||
|
+ ' -aq-mode 0 -g 240 \n'
|
||||||
|
+ ' -c:a libopus -c:s copy',
|
||||||
|
reQueueAfter: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '4KUHD';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
CQ_240p: '33',
|
||||||
|
CQ_360p: '32',
|
||||||
|
CQ_480p: '29',
|
||||||
|
CQ_720p: '28',
|
||||||
|
CQ_1080p: '27',
|
||||||
|
CQ_4KUHD: '16',
|
||||||
|
CQ_8KUHD: '17',
|
||||||
|
audio_language: 'eng,und,fre',
|
||||||
|
audio_commentary: 'true',
|
||||||
|
subtitle_language: 'eng',
|
||||||
|
subtitle_commentary: 'true',
|
||||||
|
remove_mjpeg: 'true',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
container: '.webm',
|
||||||
|
FFmpegMode: true,
|
||||||
|
handBrakeMode: false,
|
||||||
|
infoLog: '☒ Audio is not in proper codec, will format\n'
|
||||||
|
+ '☒ Transcoding file to VP9\n'
|
||||||
|
+ '☑ No subtitle processing necessary',
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -map -0:d -pix_fmt yuv420p10le -c:v libvpx-vp9 -b:v 0 -crf 16 -threads 64 -speed 2 \n'
|
||||||
|
+ ' -quality good -static-thresh 0 -tile-columns 3 -tile-rows 0 -frame-parallel 0 -row-mt 1 \n'
|
||||||
|
+ ' -aq-mode 0 -g 240 \n'
|
||||||
|
+ ' -c:a libopus -c:s copy',
|
||||||
|
reQueueAfter: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '8KUHD';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
CQ_240p: '33',
|
||||||
|
CQ_360p: '32',
|
||||||
|
CQ_480p: '29',
|
||||||
|
CQ_720p: '28',
|
||||||
|
CQ_1080p: '27',
|
||||||
|
CQ_4KUHD: '16',
|
||||||
|
CQ_8KUHD: '17',
|
||||||
|
audio_language: 'eng,und,fre',
|
||||||
|
audio_commentary: 'true',
|
||||||
|
subtitle_language: 'eng',
|
||||||
|
subtitle_commentary: 'true',
|
||||||
|
remove_mjpeg: 'true',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
container: '.webm',
|
||||||
|
FFmpegMode: true,
|
||||||
|
handBrakeMode: false,
|
||||||
|
infoLog: '☒ Audio is not in proper codec, will format\n'
|
||||||
|
+ '☒ Transcoding file to VP9\n'
|
||||||
|
+ '☑ No subtitle processing necessary',
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -map -0:d -pix_fmt yuv420p10le -c:v libvpx-vp9 -b:v 0 -crf 17 -threads 64 -speed 2 \n'
|
||||||
|
+ ' -quality good -static-thresh 0 -tile-columns 3 -tile-rows 0 -frame-parallel 0 -row-mt 1 \n'
|
||||||
|
+ ' -aq-mode 0 -g 240 \n'
|
||||||
|
+ ' -c:a libopus -c:s copy',
|
||||||
|
reQueueAfter: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.container = 'webm';
|
||||||
|
file.ffProbeData.streams[0].codec_name = 'vp9';
|
||||||
|
file.ffProbeData.streams[1].codec_name = 'opus';
|
||||||
|
file.ffProbeData.streams[1].tags.language = 'eng';
|
||||||
|
|
||||||
|
file.ffProbeData.streams[2] = _.cloneDeep(file.ffProbeData.streams[1]);
|
||||||
|
file.ffProbeData.streams[2].codec_type = 'subtitle';
|
||||||
|
file.ffProbeData.streams[2].tags.title = 'commentary';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
CQ_240p: '33',
|
||||||
|
CQ_360p: '32',
|
||||||
|
CQ_480p: '29',
|
||||||
|
CQ_720p: '28',
|
||||||
|
CQ_1080p: '27',
|
||||||
|
CQ_4KUHD: '16',
|
||||||
|
CQ_8KUHD: '17',
|
||||||
|
audio_language: 'eng,und,fre',
|
||||||
|
audio_commentary: 'true',
|
||||||
|
subtitle_language: 'eng,und',
|
||||||
|
subtitle_commentary: 'true',
|
||||||
|
remove_mjpeg: 'true',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
container: '.webm',
|
||||||
|
FFmpegMode: true,
|
||||||
|
handBrakeMode: false,
|
||||||
|
infoLog: '☑ No audio processing necessary\n'
|
||||||
|
+ '☑ File is in proper video format\n'
|
||||||
|
+ '☑ No video processing necessary\n'
|
||||||
|
+ '☒ Removing Commentary or Description subtitle: commentary',
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -map -0:d -c:v copy \n -c:a copy -c:s copy -map -0:s:0',
|
||||||
|
reQueueAfter: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.container = 'webm';
|
||||||
|
file.ffProbeData.streams[0].codec_name = 'vp9';
|
||||||
|
file.ffProbeData.streams[1].codec_name = 'opus';
|
||||||
|
file.ffProbeData.streams[1].tags.language = 'eng';
|
||||||
|
|
||||||
|
file.ffProbeData.streams[2] = _.cloneDeep(file.ffProbeData.streams[0]);
|
||||||
|
file.ffProbeData.streams[2].codec_name = 'mjpeg';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
CQ_240p: '33',
|
||||||
|
CQ_360p: '32',
|
||||||
|
CQ_480p: '29',
|
||||||
|
CQ_720p: '28',
|
||||||
|
CQ_1080p: '27',
|
||||||
|
CQ_4KUHD: '16',
|
||||||
|
CQ_8KUHD: '17',
|
||||||
|
audio_language: 'eng,und,fre',
|
||||||
|
audio_commentary: 'true',
|
||||||
|
subtitle_language: 'eng,und',
|
||||||
|
subtitle_commentary: 'true',
|
||||||
|
remove_mjpeg: 'true',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
container: '.webm',
|
||||||
|
FFmpegMode: true,
|
||||||
|
handBrakeMode: false,
|
||||||
|
infoLog: '☑ No audio processing necessary\n'
|
||||||
|
+ '☑ File is in proper video format\n'
|
||||||
|
+ '☒ Removing mjpeg\n'
|
||||||
|
+ '☑ No subtitle processing necessary',
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -map -0:d -c:v copy -map -0:v:1 \n -c:a copy -c:s copy',
|
||||||
|
reQueueAfter: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.container = 'webm';
|
||||||
|
file.ffProbeData.streams[0].codec_name = 'vp9';
|
||||||
|
file.ffProbeData.streams[1].codec_name = 'opus';
|
||||||
|
file.ffProbeData.streams[1].tags.language = 'eng';
|
||||||
|
|
||||||
|
file.ffProbeData.streams[2] = _.cloneDeep(file.ffProbeData.streams[1]);
|
||||||
|
file.ffProbeData.streams[2].tags.language = 'fre';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
CQ_240p: '33',
|
||||||
|
CQ_360p: '32',
|
||||||
|
CQ_480p: '29',
|
||||||
|
CQ_720p: '28',
|
||||||
|
CQ_1080p: '27',
|
||||||
|
CQ_4KUHD: '16',
|
||||||
|
CQ_8KUHD: '17',
|
||||||
|
audio_language: 'eng,und',
|
||||||
|
audio_commentary: 'true',
|
||||||
|
subtitle_language: 'eng,und',
|
||||||
|
subtitle_commentary: 'true',
|
||||||
|
remove_mjpeg: 'true',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
container: '.webm',
|
||||||
|
FFmpegMode: true,
|
||||||
|
handBrakeMode: false,
|
||||||
|
infoLog: '☒ Removing audio track in language fre\n'
|
||||||
|
+ '☑ File is in proper video format\n'
|
||||||
|
+ '☑ No video processing necessary\n'
|
||||||
|
+ '☑ No subtitle processing necessary',
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -map -0:d -c:v copy \n -c:a copy -map -0:a:1 -c:s copy',
|
||||||
|
reQueueAfter: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
|
|
@ -5,11 +5,11 @@ const run = require('../helpers/run');
|
||||||
const tests = [
|
const tests = [
|
||||||
{
|
{
|
||||||
input: {
|
input: {
|
||||||
file: require('../sampleData/media/sampleH264_1.json'),
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
librarySettings: {},
|
librarySettings: {},
|
||||||
inputs: {},
|
inputs: {},
|
||||||
otherArguments: {
|
otherArguments: {
|
||||||
originalLibraryFile: require('../sampleData/media/sampleH264_1.json'),
|
originalLibraryFile: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
|
|
@ -23,7 +23,7 @@ const tests = [
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
input: {
|
input: {
|
||||||
file: require('../sampleData/media/sampleH264_1.json'),
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
librarySettings: {},
|
librarySettings: {},
|
||||||
inputs: {
|
inputs: {
|
||||||
upperBound: '110',
|
upperBound: '110',
|
||||||
|
|
@ -44,7 +44,7 @@ const tests = [
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
input: {
|
input: {
|
||||||
file: require('../sampleData/media/sampleH264_1.json'),
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
librarySettings: {},
|
librarySettings: {},
|
||||||
inputs: {
|
inputs: {
|
||||||
upperBound: '120',
|
upperBound: '120',
|
||||||
|
|
|
||||||
68
tests/Community/Tdarr_Plugin_a9hf_New_file_duration_check.js
Normal file
68
tests/Community/Tdarr_Plugin_a9hf_New_file_duration_check.js
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {
|
||||||
|
originalLibraryFile: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: 'New file has duration 5.312 s which is 100.000% of original file duration: 5.312 s',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
upperBound: '110',
|
||||||
|
lowerBound: '35',
|
||||||
|
},
|
||||||
|
otherArguments: {
|
||||||
|
originalLibraryFile: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.mediaInfo.track.filter((row) => row['@type'] === 'General')[0].Duration = 20;
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
output: 'New file duration not within limits. New file has duration 5.312 s which is 26.560% of original file duration: 20 s. lowerBound is 35%',
|
||||||
|
error: {
|
||||||
|
shouldThrow: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
upperBound: '110',
|
||||||
|
lowerBound: '35',
|
||||||
|
},
|
||||||
|
otherArguments: {
|
||||||
|
originalLibraryFile: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.mediaInfo.track.filter((row) => row['@type'] === 'General')[0].Duration = 1;
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
output: 'New file duration not within limits. New file has duration 5.312 s which is 531.200% of original file duration: 1 s. upperBound is 110%',
|
||||||
|
error: {
|
||||||
|
shouldThrow: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
|
|
@ -11,21 +11,57 @@ const tests = [
|
||||||
otherArguments: {},
|
otherArguments: {},
|
||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
processFile: true,
|
linux: {
|
||||||
preset: '-fflags +genpts -hwaccel qsv -c:v h264_qsv<io> -map 0 -c:v hevc_qsv -b:v 759k -minrate 569k -maxrate 949k -bufsize 1517k -preset slow \n'
|
processFile: true,
|
||||||
+ ' -c:a copy -c:s copy -max_muxing_queue_size 9999 ',
|
preset: '-fflags +genpts -hwaccel qsv -c:v h264_qsv<io> -map 0 -c:v hevc_qsv -b:v 759k -minrate 569k -maxrate 949k -bufsize 1517k -preset slow \n'
|
||||||
handBrakeMode: false,
|
+ ' -c:a copy -c:s copy -max_muxing_queue_size 9999 ',
|
||||||
FFmpegMode: true,
|
handBrakeMode: false,
|
||||||
reQueueAfter: true,
|
FFmpegMode: true,
|
||||||
infoLog: '☑ It looks like the current bitrate is 1517k. \n'
|
reQueueAfter: true,
|
||||||
+ '\n'
|
infoLog: '☑ It looks like the current bitrate is 1517k. \n'
|
||||||
+ 'Container for output selected as mkv. \n'
|
+ '\n'
|
||||||
+ 'Encode variable bitrate settings: \n'
|
+ 'Container for output selected as mkv. \n'
|
||||||
+ 'Target = 759k \n'
|
+ 'Encode variable bitrate settings: \n'
|
||||||
+ 'Minimum = 569k \n'
|
+ 'Target = 759k \n'
|
||||||
+ 'Maximum = 949k \n'
|
+ 'Minimum = 569k \n'
|
||||||
+ 'File Transcoding... \n',
|
+ 'Maximum = 949k \n'
|
||||||
container: '.mkv',
|
+ 'File Transcoding... \n',
|
||||||
|
container: '.mkv',
|
||||||
|
},
|
||||||
|
win32: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '-fflags +genpts -hwaccel qsv -c:v h264_qsv<io> -map 0 -c:v hevc_qsv -load_plugin hevc_hw -b:v 759k -minrate 569k -maxrate 949k -bufsize 1517k -preset slow \n'
|
||||||
|
+ ' -c:a copy -c:s copy -max_muxing_queue_size 9999 ',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑ It looks like the current bitrate is 1517k. \n'
|
||||||
|
+ '\n'
|
||||||
|
+ 'Container for output selected as mkv. \n'
|
||||||
|
+ 'Encode variable bitrate settings: \n'
|
||||||
|
+ 'Target = 759k \n'
|
||||||
|
+ 'Minimum = 569k \n'
|
||||||
|
+ 'Maximum = 949k \n'
|
||||||
|
+ 'File Transcoding... \n',
|
||||||
|
container: '.mkv',
|
||||||
|
},
|
||||||
|
darwin: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '-fflags +genpts -hwaccel qsv -c:v h264_qsv<io> -map 0 -c:v hevc_videotoolbox -b:v 759k -minrate 569k -maxrate 949k -bufsize 1517k -preset slow \n'
|
||||||
|
+ ' -c:a copy -c:s copy -max_muxing_queue_size 9999 ',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑ It looks like the current bitrate is 1517k. \n'
|
||||||
|
+ '\n'
|
||||||
|
+ 'Container for output selected as mkv. \n'
|
||||||
|
+ 'Encode variable bitrate settings: \n'
|
||||||
|
+ 'Target = 759k \n'
|
||||||
|
+ 'Minimum = 569k \n'
|
||||||
|
+ 'Maximum = 949k \n'
|
||||||
|
+ 'File Transcoding... \n',
|
||||||
|
container: '.mkv',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -40,22 +76,60 @@ const tests = [
|
||||||
otherArguments: {},
|
otherArguments: {},
|
||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
processFile: true,
|
linux: {
|
||||||
preset: '-fflags +genpts -hwaccel qsv<io> -map 0 -c:v hevc_qsv -b:v 759k -minrate 569k -maxrate 949k -bufsize 1517k -preset fast \n'
|
processFile: true,
|
||||||
+ ' -c:a copy -c:s copy -max_muxing_queue_size 9999 -profile:v main10 -pix_fmt p010le ',
|
preset: '-fflags +genpts -hwaccel qsv<io> -map 0 -c:v hevc_qsv -b:v 759k -minrate 569k -maxrate 949k -bufsize 1517k -preset fast \n'
|
||||||
handBrakeMode: false,
|
+ ' -c:a copy -c:s copy -max_muxing_queue_size 9999 -profile:v main10 -pix_fmt p010le ',
|
||||||
FFmpegMode: true,
|
handBrakeMode: false,
|
||||||
reQueueAfter: true,
|
FFmpegMode: true,
|
||||||
infoLog: '☑ It looks like the current bitrate is 1517k. \n'
|
reQueueAfter: true,
|
||||||
+ '10 bit encode enabled. Setting Main10 Profile & 10 bit pixel format \n'
|
infoLog: '☑ It looks like the current bitrate is 1517k. \n'
|
||||||
+ '\n'
|
+ '10 bit encode enabled. Setting Main10 Profile & 10 bit pixel format \n'
|
||||||
+ 'Container for output selected as mp4. \n'
|
+ '\n'
|
||||||
+ 'Encode variable bitrate settings: \n'
|
+ 'Container for output selected as mp4. \n'
|
||||||
+ 'Target = 759k \n'
|
+ 'Encode variable bitrate settings: \n'
|
||||||
+ 'Minimum = 569k \n'
|
+ 'Target = 759k \n'
|
||||||
+ 'Maximum = 949k \n'
|
+ 'Minimum = 569k \n'
|
||||||
+ 'File Transcoding... \n',
|
+ 'Maximum = 949k \n'
|
||||||
container: '.mp4',
|
+ 'File Transcoding... \n',
|
||||||
|
container: '.mp4',
|
||||||
|
},
|
||||||
|
win32: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '-fflags +genpts -hwaccel qsv<io> -map 0 -c:v hevc_qsv -load_plugin hevc_hw -b:v 759k -minrate 569k -maxrate 949k -bufsize 1517k -preset fast \n'
|
||||||
|
+ ' -c:a copy -c:s copy -max_muxing_queue_size 9999 -profile:v main10 -pix_fmt p010le ',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑ It looks like the current bitrate is 1517k. \n'
|
||||||
|
+ '10 bit encode enabled. Setting Main10 Profile & 10 bit pixel format \n'
|
||||||
|
+ '\n'
|
||||||
|
+ 'Container for output selected as mp4. \n'
|
||||||
|
+ 'Encode variable bitrate settings: \n'
|
||||||
|
+ 'Target = 759k \n'
|
||||||
|
+ 'Minimum = 569k \n'
|
||||||
|
+ 'Maximum = 949k \n'
|
||||||
|
+ 'File Transcoding... \n',
|
||||||
|
container: '.mp4',
|
||||||
|
},
|
||||||
|
darwin: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '-fflags +genpts -hwaccel qsv<io> -map 0 -c:v hevc_videotoolbox -b:v 759k -minrate 569k -maxrate 949k -bufsize 1517k -preset fast \n'
|
||||||
|
+ ' -c:a copy -c:s copy -max_muxing_queue_size 9999 -profile:v main10 -pix_fmt p010le ',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑ It looks like the current bitrate is 1517k. \n'
|
||||||
|
+ '10 bit encode enabled. Setting Main10 Profile & 10 bit pixel format \n'
|
||||||
|
+ '\n'
|
||||||
|
+ 'Container for output selected as mp4. \n'
|
||||||
|
+ 'Encode variable bitrate settings: \n'
|
||||||
|
+ 'Target = 759k \n'
|
||||||
|
+ 'Minimum = 569k \n'
|
||||||
|
+ 'Maximum = 949k \n'
|
||||||
|
+ 'File Transcoding... \n',
|
||||||
|
container: '.mp4',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
84
tests/Community/Tdarr_Plugin_s710_nick_h265_nvenc_4K.js
Normal file
84
tests/Community/Tdarr_Plugin_s710_nick_h265_nvenc_4K.js
Normal file
|
|
@ -0,0 +1,84 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0:v -map 0:a:0 -map 0:a -map 0:s? -map 0:d? -c copy -c:a:0 ac3 -b:a:0 192k -ac 2',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☒File has no language track in ac3,eac3,dts. No eng track marked so transcoding audio track 1 into ac3! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH265_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0:v -map 0:a:0 -map 0:a -map 0:s? -map 0:d? -c copy -c:a:0 ac3 -b:a:0 192k -ac 2',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☒File has no language track in ac3,eac3,dts. No eng track marked so transcoding audio track 1 into ac3! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH265_1.json'));
|
||||||
|
file.ffProbeData.streams[1].codec_name = 'ac3';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: false,
|
||||||
|
infoLog: '☑File is in mkv container! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '4KUHD';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '-Z "H.265 MKV 2160p60" --all-audio --all-subtitles',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: true,
|
||||||
|
FFmpegMode: false,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: "☒ 4K file isn't in hevc! \n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
63
tests/Community/Tdarr_Plugin_s7x9_winsome_h265_10bit.js
Normal file
63
tests/Community/Tdarr_Plugin_s7x9_winsome_h265_10bit.js
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '-Z "H.265 MKV 2160p60" -e x265_10bit --all-audio --all-subtitles',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: true,
|
||||||
|
FFmpegMode: false,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: "☒File isn't in hevc! \n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH265_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0:v -map 0:a:0 -map 0:a -map 0:s? -map 0:d? -c copy -c:a:0 ac3 -b:a:0 192k -ac 2',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☒File has no language track in ac3,eac3,dts. No eng track marked so transcoding audio track 1 into ac3! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH265_1.json'));
|
||||||
|
file.ffProbeData.streams[1].codec_name = 'ac3';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: false,
|
||||||
|
infoLog: '☑File is in mkv container! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
63
tests/Community/Tdarr_Plugin_s7x9_winsome_h265_nvenc.js
Normal file
63
tests/Community/Tdarr_Plugin_s7x9_winsome_h265_nvenc.js
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '-Z "H.265 MKV 2160p60" --all-audio --all-subtitles -e nvenc_h265',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: true,
|
||||||
|
FFmpegMode: false,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: "☒File isn't in hevc! \n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH265_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0:v -map 0:a:0 -map 0:a -map 0:s? -map 0:d? -c copy -c:a:0 ac3 -b:a:0 192k -ac 2',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☒File has no language track in ac3,eac3,dts. No eng track marked so transcoding audio track 1 into ac3! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH265_1.json'));
|
||||||
|
file.ffProbeData.streams[1].codec_name = 'ac3';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: false,
|
||||||
|
infoLog: '☑File is in mkv container! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: false,
|
||||||
|
reQueueAfter: false,
|
||||||
|
infoLog: '☑File is a video! \n'
|
||||||
|
+ "☑File doesn't contain commentary tracks! \n"
|
||||||
|
+ '☑File meets conditions! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.ffProbeData.streams[1].tags.title = 'commentary';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map 0 -map -0:a:0 -c copy',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n☒File contains commentary tracks. Removing! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: false,
|
||||||
|
infoLog: "☑File doesn't contain tracks which are not english or undefined! \n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.ffProbeData.streams[1].tags.language = 'fre';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: false,
|
||||||
|
infoLog: "☑File doesn't contain tracks which are not english or undefined! \n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map 0 -map -0:a:3 -c copy',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☒File contains tracks which are not english or undefined. Removing! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
46
tests/Community/Tdarr_Plugin_vdka_Remove_DataStreams.js
Normal file
46
tests/Community/Tdarr_Plugin_vdka_Remove_DataStreams.js
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: false,
|
||||||
|
infoLog: '☑File has no data streams! \n☑File meets conditions! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.ffProbeData.streams[1].codec_type = 'data';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -c copy -dn -map_chapters -1',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☒File has data streams \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
|
|
@ -0,0 +1,244 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '<io> -map 0 -dn -c:v libx265 -preset slow -x265-params crf=22:bframes=8:rc-lookahead=32:ref=6:b-intra=1:aq-mode=3 -a53cc 0 -c:a copy -c:s copy -max_muxing_queue_size 9999',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n'
|
||||||
|
+ '☒File is not hevc!\n'
|
||||||
|
+ '☑Preset set as slow\n'
|
||||||
|
+ '☑File is 720p, using CRF value of 22!\n'
|
||||||
|
+ 'File is being transcoded!\n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH265_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n☑File is already in hevc! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
sdCRF: '21',
|
||||||
|
hdCRF: '23',
|
||||||
|
fullhdCRF: '24',
|
||||||
|
uhdCRF: '29',
|
||||||
|
bframe: '10',
|
||||||
|
ffmpegPreset: 'medium',
|
||||||
|
sdDisabled: 'false',
|
||||||
|
uhdDisabled: 'false',
|
||||||
|
force10bit: 'force10bit',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '<io> -map 0 -dn -c:v libx265 -preset medium -x265-params crf=23:bframes=10:rc-lookahead=32:ref=6:b-intra=1:aq-mode=3 -a53cc 0 -c:a copy -c:s copy -max_muxing_queue_size 9999',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n'
|
||||||
|
+ '☒File is not hevc!\n'
|
||||||
|
+ '☑Preset set as medium\n'
|
||||||
|
+ '☑File is 720p, using CRF value of 23!\n'
|
||||||
|
+ 'File is being transcoded!\n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '480p';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
sdCRF: '21',
|
||||||
|
hdCRF: '23',
|
||||||
|
fullhdCRF: '24',
|
||||||
|
uhdCRF: '29',
|
||||||
|
bframe: '10',
|
||||||
|
ffmpegPreset: 'medium',
|
||||||
|
sdDisabled: 'false',
|
||||||
|
uhdDisabled: 'false',
|
||||||
|
force10bit: 'force10bit',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '<io> -map 0 -dn -c:v libx265 -preset medium -x265-params crf=21:bframes=10:rc-lookahead=32:ref=6:b-intra=1:aq-mode=3 -a53cc 0 -c:a copy -c:s copy -max_muxing_queue_size 9999',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n'
|
||||||
|
+ '☒File is not hevc!\n'
|
||||||
|
+ '☑Preset set as medium\n'
|
||||||
|
+ '☑File is 480p, using CRF value of 21!\n'
|
||||||
|
+ 'File is being transcoded!\n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '480p';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
sdCRF: '21',
|
||||||
|
hdCRF: '23',
|
||||||
|
fullhdCRF: '24',
|
||||||
|
uhdCRF: '29',
|
||||||
|
bframe: '10',
|
||||||
|
ffmpegPreset: 'medium',
|
||||||
|
sdDisabled: 'true',
|
||||||
|
uhdDisabled: 'false',
|
||||||
|
force10bit: 'force10bit',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n☒File is SD and disabled, not processing\n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '4KUHD';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
sdCRF: '21',
|
||||||
|
hdCRF: '23',
|
||||||
|
fullhdCRF: '24',
|
||||||
|
uhdCRF: '29',
|
||||||
|
bframe: '10',
|
||||||
|
ffmpegPreset: 'medium',
|
||||||
|
sdDisabled: 'false',
|
||||||
|
uhdDisabled: 'false',
|
||||||
|
force10bit: 'force10bit',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '<io> -map 0 -dn -c:v libx265 -preset medium -x265-params crf=29:bframes=10:rc-lookahead=32:ref=6:b-intra=1:aq-mode=3 -a53cc 0 -c:a copy -c:s copy -max_muxing_queue_size 9999',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n'
|
||||||
|
+ '☒File is not hevc!\n'
|
||||||
|
+ '☑Preset set as medium\n'
|
||||||
|
+ '☑File is 4KUHD, using CRF value of 29!\n'
|
||||||
|
+ 'File is being transcoded!\n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '4KUHD';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
sdCRF: '21',
|
||||||
|
hdCRF: '23',
|
||||||
|
fullhdCRF: '24',
|
||||||
|
uhdCRF: '29',
|
||||||
|
bframe: '10',
|
||||||
|
ffmpegPreset: 'medium',
|
||||||
|
sdDisabled: 'false',
|
||||||
|
uhdDisabled: 'true',
|
||||||
|
force10bit: 'force10bit',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n☒File is 4k/UHD and disabled, not processing\n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '1080p';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
sdCRF: '21',
|
||||||
|
hdCRF: '23',
|
||||||
|
fullhdCRF: '24',
|
||||||
|
uhdCRF: '29',
|
||||||
|
bframe: '10',
|
||||||
|
ffmpegPreset: 'medium',
|
||||||
|
sdDisabled: 'false',
|
||||||
|
uhdDisabled: 'false',
|
||||||
|
force10bit: 'force10bit',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '<io> -map 0 -dn -c:v libx265 -preset medium -x265-params crf=24:bframes=10:rc-lookahead=32:ref=6:b-intra=1:aq-mode=3 -a53cc 0 -c:a copy -c:s copy -max_muxing_queue_size 9999',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n'
|
||||||
|
+ '☒File is not hevc!\n'
|
||||||
|
+ '☑Preset set as medium\n'
|
||||||
|
+ '☑File is 1080p, using CRF value of 24!\n'
|
||||||
|
+ 'File is being transcoded!\n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
|
|
@ -0,0 +1,170 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '-c:v h264_cuvid,-map 0 -dn -c:v hevc_nvenc -b:v 0 -preset slow -cq 23 -rc-lookahead 32 -bf 0 -a53cc 0 -c:a copy -c:s copy',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n'
|
||||||
|
+ '☑Preset set as slow\n'
|
||||||
|
+ '☑File is 720p, using CQ:V value of 23!\n'
|
||||||
|
+ '☒File is not hevc!\n'
|
||||||
|
+ 'File is being transcoded!\n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH265_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: false,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n☑File is already in hevc! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
sdCQV: '22',
|
||||||
|
hdCQV: '24',
|
||||||
|
fullhdCQV: '26',
|
||||||
|
uhdCQV: '29',
|
||||||
|
bframe: '5',
|
||||||
|
ffmpeg_preset: 'medium',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '-c:v h264_cuvid,-map 0 -dn -c:v hevc_nvenc -b:v 0 -preset medium -cq 24 -rc-lookahead 32 -bf 5 -a53cc 0 -c:a copy -c:s copy',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n'
|
||||||
|
+ '☑Preset set as medium\n'
|
||||||
|
+ '☑File is 720p, using CQ:V value of 24!\n'
|
||||||
|
+ '☒File is not hevc!\n'
|
||||||
|
+ 'File is being transcoded!\n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '480p';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
sdCQV: '22',
|
||||||
|
hdCQV: '24',
|
||||||
|
fullhdCQV: '26',
|
||||||
|
uhdCQV: '29',
|
||||||
|
bframe: '5',
|
||||||
|
ffmpeg_preset: 'medium',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '-c:v h264_cuvid,-map 0 -dn -c:v hevc_nvenc -b:v 0 -preset medium -cq 22 -rc-lookahead 32 -bf 5 -a53cc 0 -c:a copy -c:s copy',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n'
|
||||||
|
+ '☑Preset set as medium\n'
|
||||||
|
+ '☑File is 480p, using CQ:V value of 22!\n'
|
||||||
|
+ '☒File is not hevc!\n'
|
||||||
|
+ 'File is being transcoded!\n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '1080p';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
sdCQV: '22',
|
||||||
|
hdCQV: '24',
|
||||||
|
fullhdCQV: '26',
|
||||||
|
uhdCQV: '29',
|
||||||
|
bframe: '5',
|
||||||
|
ffmpeg_preset: 'medium',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '-c:v h264_cuvid,-map 0 -dn -c:v hevc_nvenc -b:v 0 -preset medium -cq 26 -rc-lookahead 32 -bf 5 -a53cc 0 -c:a copy -c:s copy',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n'
|
||||||
|
+ '☑Preset set as medium\n'
|
||||||
|
+ '☑File is 1080p, using CQ:V value of 26!\n'
|
||||||
|
+ '☒File is not hevc!\n'
|
||||||
|
+ 'File is being transcoded!\n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.video_resolution = '4KUHD';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {
|
||||||
|
sdCQV: '22',
|
||||||
|
hdCQV: '24',
|
||||||
|
fullhdCQV: '26',
|
||||||
|
uhdCQV: '29',
|
||||||
|
bframe: '5',
|
||||||
|
ffmpeg_preset: 'medium',
|
||||||
|
},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: '-c:v h264_cuvid,-map 0 -dn -c:v hevc_nvenc -b:v 0 -preset medium -cq 29 -rc-lookahead 32 -bf 5 -a53cc 0 -c:a copy -c:s copy',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is a video! \n'
|
||||||
|
+ '☑Preset set as medium\n'
|
||||||
|
+ '☑File is 4KUHD, using CQ:V value of 29!\n'
|
||||||
|
+ '☒File is not hevc!\n'
|
||||||
|
+ 'File is being transcoded!\n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
42
tests/Community/Tdarr_Plugin_x7ab_Remove_Subs.js
Normal file
42
tests/Community/Tdarr_Plugin_x7ab_Remove_Subs.js
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: false,
|
||||||
|
infoLog: '☑File has no subs \n☑File meets conditions! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-sn -map 0 -c copy',
|
||||||
|
container: '.mkv',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☒File has subs \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
67
tests/Community/Tdarr_Plugin_x7ac_Remove_Closed_Captions.js
Normal file
67
tests/Community/Tdarr_Plugin_x7ac_Remove_Closed_Captions.js
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: ',-map 0 -codec copy -bsf:v "filter_units=remove_types=6"',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑Closed captions have not been detected on this file \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.hasClosedCaptions = true;
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -codec copy -bsf:v "filter_units=remove_types=6"',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☒This file has closed captions \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.ffProbeData.streams[0].closed_captions = 1;
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ',-map 0 -codec copy -bsf:v "filter_units=remove_types=6"',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☒This file has burnt closed captions \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map_metadata -1 -map 0:v -map 0:s? -map 0:a -c:v copy -c:a copy -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is already in h264! \n☒File has title metadata \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH265_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map_metadata -1 -map 0:v -map 0:s? -map 0:a -c:v libx264 -preset medium -c:a aac -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☒File is not in h264! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.meta.Title = undefined;
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: false,
|
||||||
|
reQueueAfter: false,
|
||||||
|
infoLog: '☑File is already in h264! \n'
|
||||||
|
+ '☑File has no title metadata \n'
|
||||||
|
+ '☑File has aac track \n'
|
||||||
|
+ '☑File has no/compatible subs \n'
|
||||||
|
+ '☑File meets conditions! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.meta.Title = undefined;
|
||||||
|
file.ffProbeData.streams[1].codec_name = 'ac3';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map 0:v -map 0:s? -map 0:a -c:v copy -c:a aac -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is already in h264! \n'
|
||||||
|
+ '☑File has no title metadata \n'
|
||||||
|
+ '☒File has no aac track \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map 0:v -map 0:s? -map 0:a -c:v copy -c:a copy -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: false,
|
||||||
|
infoLog: '☑File is already in h264! \n'
|
||||||
|
+ '☑File has no title metadata \n'
|
||||||
|
+ '☑File has aac track \n'
|
||||||
|
+ '☒File has incompatible subs \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map_metadata -1 -map 0:v -map 0:s? -map 0:a -c:v copy -c:a copy -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is already in h264! \n☒File has title metadata \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH265_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map_metadata -1 -map 0:v -map 0:s? -map 0:a -c:v libx264 -preset fast -c:a aac -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☒File is not in h264! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.meta.Title = undefined;
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: false,
|
||||||
|
reQueueAfter: false,
|
||||||
|
infoLog: '☑File is already in h264! \n'
|
||||||
|
+ '☑File has no title metadata \n'
|
||||||
|
+ '☑File has aac track \n'
|
||||||
|
+ '☑File has no/compatible subs \n'
|
||||||
|
+ '☑File meets conditions! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.meta.Title = undefined;
|
||||||
|
file.ffProbeData.streams[1].codec_name = 'ac3';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map 0:v -map 0:s? -map 0:a -c:v copy -c:a aac -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is already in h264! \n'
|
||||||
|
+ '☑File has no title metadata \n'
|
||||||
|
+ '☒File has no aac track \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map 0:v -map 0:s? -map 0:a -c:v copy -c:a copy -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is already in h264! \n'
|
||||||
|
+ '☑File has no title metadata \n'
|
||||||
|
+ '☑File has aac track \n'
|
||||||
|
+ '☒File has incompatible subs \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map_metadata -1 -map 0:v -map 0:s? -map 0:a -c:v copy -c:a copy -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is already in h264! \n☒File has title metadata \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH265_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map_metadata -1 -map 0:v -map 0:s? -map 0:a -c:v libx264 -preset slow -c:a aac -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☒File is not in h264! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.meta.Title = undefined;
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: false,
|
||||||
|
reQueueAfter: false,
|
||||||
|
infoLog: '☑File is already in h264! \n'
|
||||||
|
+ '☑File has no title metadata \n'
|
||||||
|
+ '☑File has aac track \n'
|
||||||
|
+ '☑File has no/compatible subs \n'
|
||||||
|
+ '☑File meets conditions! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.meta.Title = undefined;
|
||||||
|
file.ffProbeData.streams[1].codec_name = 'ac3';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map 0:v -map 0:s? -map 0:a -c:v copy -c:a aac -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is already in h264! \n'
|
||||||
|
+ '☑File has no title metadata \n'
|
||||||
|
+ '☒File has no aac track \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map 0:v -map 0:s? -map 0:a -c:v copy -c:a copy -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is already in h264! \n'
|
||||||
|
+ '☑File has no title metadata \n'
|
||||||
|
+ '☑File has aac track \n'
|
||||||
|
+ '☒File has incompatible subs \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
/* eslint max-len: 0 */
|
||||||
|
const _ = require('lodash');
|
||||||
|
const run = require('../helpers/run');
|
||||||
|
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map_metadata -1 -map 0:v -map 0:s? -map 0:a -c:v copy -c:a copy -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is already in h264! \n☒File has title metadata \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH265_1.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map_metadata -1 -map 0:v -map 0:s? -map 0:a -c:v libx264 -preset veryfast -c:a aac -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☒File is not in h264! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.meta.Title = undefined;
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: false,
|
||||||
|
preset: '',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: false,
|
||||||
|
reQueueAfter: false,
|
||||||
|
infoLog: '☑File is already in h264! \n'
|
||||||
|
+ '☑File has no title metadata \n'
|
||||||
|
+ '☑File has aac track \n'
|
||||||
|
+ '☑File has no/compatible subs \n'
|
||||||
|
+ '☑File meets conditions! \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: (() => {
|
||||||
|
const file = _.cloneDeep(require('../sampleData/media/sampleH264_1.json'));
|
||||||
|
file.meta.Title = undefined;
|
||||||
|
file.ffProbeData.streams[1].codec_name = 'ac3';
|
||||||
|
return file;
|
||||||
|
})(),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map 0:v -map 0:s? -map 0:a -c:v copy -c:a aac -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is already in h264! \n'
|
||||||
|
+ '☑File has no title metadata \n'
|
||||||
|
+ '☒File has no aac track \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: {
|
||||||
|
file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')),
|
||||||
|
librarySettings: {},
|
||||||
|
inputs: {},
|
||||||
|
otherArguments: {},
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
processFile: true,
|
||||||
|
preset: ', -map 0:v -map 0:s? -map 0:a -c:v copy -c:a copy -c:s mov_text',
|
||||||
|
container: '.mp4',
|
||||||
|
handBrakeMode: false,
|
||||||
|
FFmpegMode: true,
|
||||||
|
reQueueAfter: true,
|
||||||
|
infoLog: '☑File is already in h264! \n'
|
||||||
|
+ '☑File has no title metadata \n'
|
||||||
|
+ '☑File has aac track \n'
|
||||||
|
+ '☒File has incompatible subs \n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
run(tests);
|
||||||
|
|
@ -2,6 +2,7 @@ const path = require('path');
|
||||||
const chai = require('chai');
|
const chai = require('chai');
|
||||||
const _ = require('lodash');
|
const _ = require('lodash');
|
||||||
const importFresh = require('import-fresh');
|
const importFresh = require('import-fresh');
|
||||||
|
const os = require('os');
|
||||||
|
|
||||||
const scriptName = path.basename(process.mainModule.filename);
|
const scriptName = path.basename(process.mainModule.filename);
|
||||||
|
|
||||||
|
|
@ -9,40 +10,53 @@ const run = async (tests) => {
|
||||||
try {
|
try {
|
||||||
for (let i = 0; i < tests.length; i += 1) {
|
for (let i = 0; i < tests.length; i += 1) {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log(`${scriptName}: test ${i}`);
|
console.log(`[${os.platform()}] ${scriptName}: test ${i}`);
|
||||||
const test = tests[i];
|
const test = tests[i];
|
||||||
|
|
||||||
let testOutput;
|
let expectedOutput;
|
||||||
let errorEncountered = false;
|
if (test.output[os.platform()] !== undefined) {
|
||||||
// eslint-disable-next-line import/no-dynamic-require
|
expectedOutput = test.output[os.platform()];
|
||||||
const { plugin } = importFresh(`../../Community/${scriptName}`);
|
|
||||||
|
|
||||||
try {
|
|
||||||
// eslint-disable-next-line no-await-in-loop
|
|
||||||
testOutput = await plugin(
|
|
||||||
_.cloneDeep(test.input.file),
|
|
||||||
_.cloneDeep(test.input.librarySettings),
|
|
||||||
_.cloneDeep(test.input.inputs),
|
|
||||||
_.cloneDeep(test.input.otherArguments),
|
|
||||||
);
|
|
||||||
} catch (err1) {
|
|
||||||
errorEncountered = err1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (test.outputModify) {
|
|
||||||
testOutput = test.outputModify(test.output);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (test.error && test.error.shouldThrow) {
|
|
||||||
if (errorEncountered !== false) {
|
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.log(errorEncountered);
|
|
||||||
chai.assert.deepEqual(errorEncountered.message, test.output);
|
|
||||||
} else {
|
|
||||||
throw new Error('Expected plugin error but none was thrown!');
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
chai.assert.deepEqual(testOutput, test.output);
|
expectedOutput = test.output;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (expectedOutput === false) {
|
||||||
|
// skip test due to OS
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(`Test not meant to run on ${os.platform()}, skipping`);
|
||||||
|
} else {
|
||||||
|
let testOutput;
|
||||||
|
let errorEncountered = false;
|
||||||
|
// eslint-disable-next-line import/no-dynamic-require
|
||||||
|
const { plugin } = importFresh(`../../Community/${scriptName}`);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
testOutput = await plugin(
|
||||||
|
_.cloneDeep(test.input.file),
|
||||||
|
_.cloneDeep(test.input.librarySettings),
|
||||||
|
_.cloneDeep(test.input.inputs),
|
||||||
|
_.cloneDeep(test.input.otherArguments),
|
||||||
|
);
|
||||||
|
} catch (err1) {
|
||||||
|
errorEncountered = err1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (test.outputModify) {
|
||||||
|
testOutput = test.outputModify(testOutput);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (test.error && test.error.shouldThrow) {
|
||||||
|
if (errorEncountered !== false) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(errorEncountered);
|
||||||
|
chai.assert.deepEqual(errorEncountered.message, expectedOutput);
|
||||||
|
} else {
|
||||||
|
throw new Error('Expected plugin error but none was thrown!');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
chai.assert.deepEqual(testOutput, expectedOutput);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|
|
||||||
|
|
@ -6,45 +6,71 @@ const childProcess = require('child_process');
|
||||||
|
|
||||||
const filenames = fs.readdirSync(`${process.cwd()}/Community`).reverse();
|
const filenames = fs.readdirSync(`${process.cwd()}/Community`).reverse();
|
||||||
|
|
||||||
|
const errorsEncountered = [];
|
||||||
const run = async () => {
|
const run = async () => {
|
||||||
|
const pluginsToRun = [];
|
||||||
for (let i = 0; i < filenames.length; i += 1) {
|
for (let i = 0; i < filenames.length; i += 1) {
|
||||||
const pluginPath = `${process.cwd()}/Community/${filenames[i]}`;
|
const filename = filenames[i];
|
||||||
|
const pluginPath = `${process.cwd()}/Community/${filename}`;
|
||||||
const text = fs.readFileSync(pluginPath);
|
const text = fs.readFileSync(pluginPath);
|
||||||
const pluginTestpath = `${__dirname}/Community/${filenames[i]}`;
|
const pluginTestpath = `${__dirname}/Community/${filename}`;
|
||||||
|
|
||||||
let shouldRunTest = true;
|
|
||||||
if (!text.includes('// tdarrSkipTest') && !fs.existsSync(pluginTestpath)) {
|
if (!text.includes('// tdarrSkipTest') && !fs.existsSync(pluginTestpath)) {
|
||||||
console.log(chalk.red(`${filenames[i]} does not have a test but should do.`));
|
console.log(chalk.red(`${filename} does not have a test but should do.`));
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
} else if (!text.includes('// tdarrSkipTest') && fs.existsSync(pluginTestpath)) {
|
} else if (!text.includes('// tdarrSkipTest') && fs.existsSync(pluginTestpath)) {
|
||||||
console.log(chalk.white(`${filenames[i]} running test`));
|
pluginsToRun.push({
|
||||||
|
filename,
|
||||||
|
pluginTestpath,
|
||||||
|
});
|
||||||
} else if (text.includes('// tdarrSkipTest') && fs.existsSync(pluginTestpath)) {
|
} else if (text.includes('// tdarrSkipTest') && fs.existsSync(pluginTestpath)) {
|
||||||
console.log(chalk.red(`${filenames[i]} should have // tdarrSkipTest removed`));
|
console.log(chalk.red(`${filename} should have // tdarrSkipTest removed`));
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
} else if (text.includes('// tdarrSkipTest') && !fs.existsSync(pluginTestpath)) {
|
} else if (text.includes('// tdarrSkipTest') && !fs.existsSync(pluginTestpath)) {
|
||||||
console.log(chalk.yellow(`${filenames[i]} skipping tests`));
|
console.log(chalk.yellow(`${filename} skipping tests`));
|
||||||
shouldRunTest = false;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (shouldRunTest) {
|
let pluginsFinished = 0;
|
||||||
// eslint-disable-next-line no-await-in-loop
|
for (let i = 0; i < pluginsToRun.length; i += 1) {
|
||||||
await new Promise((resolve) => {
|
const { filename } = pluginsToRun[i];
|
||||||
childProcess.exec(`node "${pluginTestpath}"`, (err, stdout, stderr) => {
|
const { pluginTestpath } = pluginsToRun[i];
|
||||||
if (err) {
|
console.log(chalk.white(`${filename} running test`));
|
||||||
console.log(err);
|
|
||||||
}
|
const output = {};
|
||||||
console.log(stdout);
|
childProcess.exec(`node "${pluginTestpath}"`, (err, stdout, stderr) => {
|
||||||
console.log(chalk.red(stderr));
|
if (err) {
|
||||||
}).on('exit', async (code) => {
|
output.err = err;
|
||||||
if (code !== 0) {
|
}
|
||||||
await new Promise((resolve2) => setTimeout(resolve2, 1000));
|
output.stdout = stdout;
|
||||||
process.exit(1);
|
output.stderr = stderr;
|
||||||
} else {
|
// eslint-disable-next-line no-loop-func
|
||||||
resolve();
|
}).on('exit', async (code) => {
|
||||||
}
|
if (code !== 0) {
|
||||||
|
await new Promise((resolve2) => setTimeout(resolve2, 1000));
|
||||||
|
errorsEncountered.push({
|
||||||
|
id: filenames[i],
|
||||||
|
...output,
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
}
|
|
||||||
|
pluginsFinished += 1;
|
||||||
|
|
||||||
|
if (pluginsFinished === pluginsToRun.length) {
|
||||||
|
if (errorsEncountered.length > 0) {
|
||||||
|
errorsEncountered.forEach((plugin) => {
|
||||||
|
console.log(plugin.id);
|
||||||
|
console.log(chalk.red(plugin.err));
|
||||||
|
console.log(plugin.stdout);
|
||||||
|
console.log(chalk.red(plugin.stderr));
|
||||||
|
});
|
||||||
|
process.exit(1);
|
||||||
|
} else {
|
||||||
|
console.log(chalk.green('No errors encountered!'));
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue