feat(subsync): setup node script for syncing subs
All checks were successful
Discord / discord commits (push) Has been skipped
All checks were successful
Discord / discord commits (push) Has been skipped
This commit is contained in:
parent
bec85ec552
commit
c51d07bdbf
7 changed files with 243 additions and 0 deletions
|
@ -10,7 +10,12 @@
|
||||||
subsync = pkgs.callPackage ./subsync {
|
subsync = pkgs.callPackage ./subsync {
|
||||||
inherit pocketsphinx-src subsync-src;
|
inherit pocketsphinx-src subsync-src;
|
||||||
};
|
};
|
||||||
|
node-syncsub = pkgs.callPackage ./node-syncsub {
|
||||||
|
inherit subsync;
|
||||||
|
};
|
||||||
in {
|
in {
|
||||||
|
environment.systemPackages = [subsync node-syncsub];
|
||||||
|
|
||||||
systemd = {
|
systemd = {
|
||||||
services.subsync-job = {
|
services.subsync-job = {
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
|
@ -22,6 +27,7 @@ in {
|
||||||
path = with pkgs; [
|
path = with pkgs; [
|
||||||
findutils
|
findutils
|
||||||
subsync
|
subsync
|
||||||
|
node-syncsub
|
||||||
];
|
];
|
||||||
|
|
||||||
script = ''
|
script = ''
|
||||||
|
|
|
@ -0,0 +1,134 @@
|
||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"es2021": true
|
||||||
|
},
|
||||||
|
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"overrides": [],
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": "latest",
|
||||||
|
"sourceType": "module"
|
||||||
|
},
|
||||||
|
"plugins": ["@stylistic", "@typescript-eslint"],
|
||||||
|
"rules": {
|
||||||
|
"array-callback-return": ["error", {
|
||||||
|
"allowImplicit": true,
|
||||||
|
"checkForEach": true
|
||||||
|
}],
|
||||||
|
"no-constructor-return": ["error"],
|
||||||
|
"no-unreachable-loop": ["error", { "ignore": [
|
||||||
|
"ForInStatement", "ForOfStatement"
|
||||||
|
]}],
|
||||||
|
|
||||||
|
|
||||||
|
"block-scoped-var": ["error"],
|
||||||
|
"class-methods-use-this": ["error"],
|
||||||
|
"curly": ["warn"],
|
||||||
|
"default-case-last": ["warn"],
|
||||||
|
"default-param-last": ["error"],
|
||||||
|
"eqeqeq": ["error", "smart"],
|
||||||
|
"func-names": ["warn", "never"],
|
||||||
|
"func-style": ["warn", "expression"],
|
||||||
|
"logical-assignment-operators": ["warn", "always"],
|
||||||
|
"no-array-constructor": ["error"],
|
||||||
|
"no-empty-function": ["warn"],
|
||||||
|
"no-empty-static-block": ["warn"],
|
||||||
|
"no-extend-native": ["error"],
|
||||||
|
"no-extra-bind": ["warn"],
|
||||||
|
"no-implicit-coercion": ["warn"],
|
||||||
|
"no-iterator": ["error"],
|
||||||
|
"no-labels": ["error"],
|
||||||
|
"no-lone-blocks": ["error"],
|
||||||
|
"no-lonely-if": ["error"],
|
||||||
|
"no-loop-func": ["error"],
|
||||||
|
"no-magic-numbers": ["error", {
|
||||||
|
"ignore": [-2, -1, 0.1, 0, 1, 2, 3, 10, 33, 66, 100, 255, 360, 450, 1000],
|
||||||
|
"ignoreDefaultValues": true,
|
||||||
|
"ignoreArrayIndexes": true
|
||||||
|
}],
|
||||||
|
"no-multi-assign": ["error"],
|
||||||
|
"no-new": ["error"],
|
||||||
|
"no-new-func": ["error"],
|
||||||
|
"no-new-wrappers": ["error"],
|
||||||
|
"no-object-constructor": ["error"],
|
||||||
|
"no-proto": ["error"],
|
||||||
|
"no-return-assign": ["error"],
|
||||||
|
"no-sequences": ["error"],
|
||||||
|
"no-shadow": ["error", { "builtinGlobals": true }],
|
||||||
|
"no-undef-init": ["warn"],
|
||||||
|
"no-undefined": ["error"],
|
||||||
|
"no-useless-constructor": ["warn"],
|
||||||
|
"no-useless-escape": ["off"],
|
||||||
|
"no-useless-return": ["error"],
|
||||||
|
"no-var": ["error"],
|
||||||
|
"no-void": ["error"],
|
||||||
|
"no-with": ["error"],
|
||||||
|
"object-shorthand": ["error", "always"],
|
||||||
|
"one-var": ["error", "never"],
|
||||||
|
"operator-assignment": ["warn", "always"],
|
||||||
|
"prefer-arrow-callback": ["error"],
|
||||||
|
"prefer-const": ["error"],
|
||||||
|
"prefer-object-has-own": ["error"],
|
||||||
|
"prefer-regex-literals": ["error"],
|
||||||
|
"prefer-template": ["warn"],
|
||||||
|
|
||||||
|
"no-unused-vars": "off",
|
||||||
|
"@typescript-eslint/no-unused-vars": "warn",
|
||||||
|
"@typescript-eslint/no-unsafe-declaration-merging": "off",
|
||||||
|
|
||||||
|
"@stylistic/array-bracket-newline": ["warn", "consistent"],
|
||||||
|
"@stylistic/array-bracket-spacing": ["warn", "never"],
|
||||||
|
"@stylistic/arrow-parens": ["warn", "always"],
|
||||||
|
"@stylistic/brace-style": ["warn", "stroustrup"],
|
||||||
|
"@stylistic/comma-dangle": ["warn", "always-multiline"],
|
||||||
|
"@stylistic/comma-spacing": ["warn", { "before": false, "after": true }],
|
||||||
|
"@stylistic/comma-style": ["error", "last"],
|
||||||
|
"@stylistic/dot-location": ["error", "property"],
|
||||||
|
"@stylistic/function-call-argument-newline": ["warn", "consistent"],
|
||||||
|
"@stylistic/function-paren-newline": ["warn", "consistent"],
|
||||||
|
"@stylistic/indent": ["warn", 4, {
|
||||||
|
"SwitchCase": 1,
|
||||||
|
"ignoreComments": true
|
||||||
|
}],
|
||||||
|
"@stylistic/key-spacing": ["warn", { "beforeColon": false, "afterColon": true }],
|
||||||
|
"@stylistic/keyword-spacing": ["warn", { "before": true }],
|
||||||
|
"@stylistic/linebreak-style": ["error", "unix"],
|
||||||
|
"@stylistic/lines-between-class-members": ["warn", "always", { "exceptAfterSingleLine": true }],
|
||||||
|
"@stylistic/max-len": ["warn", {
|
||||||
|
"code": 100,
|
||||||
|
"ignoreComments": true,
|
||||||
|
"ignoreTrailingComments": true,
|
||||||
|
"ignoreUrls": true
|
||||||
|
}],
|
||||||
|
"@stylistic/multiline-ternary": ["warn", "always-multiline"],
|
||||||
|
"@stylistic/new-parens": ["error"],
|
||||||
|
"@stylistic/no-mixed-operators": ["warn"],
|
||||||
|
"@stylistic/no-mixed-spaces-and-tabs": ["error"],
|
||||||
|
"@stylistic/no-multi-spaces": ["error"],
|
||||||
|
"@stylistic/no-tabs": ["error"],
|
||||||
|
"@stylistic/no-trailing-spaces": ["error"],
|
||||||
|
"@stylistic/no-whitespace-before-property": ["warn"],
|
||||||
|
"@stylistic/nonblock-statement-body-position": ["error", "below"],
|
||||||
|
"@stylistic/object-curly-newline": ["warn", { "consistent": true }],
|
||||||
|
"@stylistic/object-property-newline": ["warn", {"allowAllPropertiesOnSameLine": false}],
|
||||||
|
"@stylistic/object-curly-spacing": ["warn", "always"],
|
||||||
|
"@stylistic/operator-linebreak": ["warn", "after"],
|
||||||
|
"@stylistic/padded-blocks": ["error", "never"],
|
||||||
|
"@stylistic/padding-line-between-statements": ["warn",
|
||||||
|
{ "blankLine": "always", "prev": "*", "next": "return" },
|
||||||
|
{ "blankLine": "always", "prev": ["const", "let", "var"], "next": "*"},
|
||||||
|
{ "blankLine": "any", "prev": ["const", "let", "var"], "next": ["const", "let", "var"]},
|
||||||
|
{ "blankLine": "always", "prev": ["case", "default"], "next": "*" }
|
||||||
|
],
|
||||||
|
"@stylistic/quote-props": ["error", "consistent-as-needed"],
|
||||||
|
"@stylistic/quotes": ["error", "single", { "avoidEscape": true }],
|
||||||
|
"@stylistic/semi": ["error", "always"],
|
||||||
|
"@stylistic/semi-spacing": ["warn"],
|
||||||
|
"@stylistic/space-before-blocks": ["warn"],
|
||||||
|
"@stylistic/space-before-function-paren": ["warn", "never"],
|
||||||
|
"@stylistic/space-infix-ops": ["warn"],
|
||||||
|
"@stylistic/spaced-comment": ["warn", "always"],
|
||||||
|
"@stylistic/switch-colon-spacing": ["warn"],
|
||||||
|
"@stylistic/wrap-regex": ["warn"]
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
{
|
||||||
|
buildNpmPackage,
|
||||||
|
nodejs_20,
|
||||||
|
subsync,
|
||||||
|
typescript,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
buildNpmPackage {
|
||||||
|
name = "node-syncsub";
|
||||||
|
src = ./.;
|
||||||
|
npmDepsHash = "sha256-kQBZ13bTMxZnv45IwyIV0cYA5tjr4KKU1cpDNx02th0=
|
||||||
|
";
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
subsync
|
||||||
|
typescript
|
||||||
|
nodejs_20
|
||||||
|
];
|
||||||
|
|
||||||
|
buildPhase = ''
|
||||||
|
tsc -p tsconfig.json
|
||||||
|
'';
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
mv node_modules package.json $out
|
||||||
|
|
||||||
|
echo '#!/usr/bin/env node' > $out/bin/node-syncsub
|
||||||
|
cat ./build/main.js >> $out/bin/node-syncsub
|
||||||
|
chmod +x $out/bin/node-syncsub
|
||||||
|
'';
|
||||||
|
}
|
42
devices/nos/modules/subtitles/syncing/node-syncsub/main.ts
Executable file
42
devices/nos/modules/subtitles/syncing/node-syncsub/main.ts
Executable file
|
@ -0,0 +1,42 @@
|
||||||
|
import { readdir } from 'fs';
|
||||||
|
|
||||||
|
const SUB_EXT_LENGTH = 7;
|
||||||
|
|
||||||
|
|
||||||
|
const FILE = process.argv[2];
|
||||||
|
const BASE_NAME = FILE.substring(
|
||||||
|
FILE.lastIndexOf('/') + 1,
|
||||||
|
FILE.length - SUB_EXT_LENGTH,
|
||||||
|
);
|
||||||
|
|
||||||
|
const DIR = FILE.substring(0, FILE.lastIndexOf('/'));
|
||||||
|
|
||||||
|
readdir(DIR, (_, files) => {
|
||||||
|
const VIDEO = files.filter((f) =>
|
||||||
|
f.includes(BASE_NAME) &&
|
||||||
|
!f.endsWith('.nfo') &&
|
||||||
|
!f.endsWith('.srt'))[0];
|
||||||
|
|
||||||
|
let lang = FILE.split('.').at(-2);
|
||||||
|
|
||||||
|
if (lang === 'fr') {
|
||||||
|
lang = 'fre';
|
||||||
|
}
|
||||||
|
else if (lang === 'en') {
|
||||||
|
lang = 'eng';
|
||||||
|
}
|
||||||
|
|
||||||
|
const cmd = [
|
||||||
|
'subsync --cli sync',
|
||||||
|
`--sub-lang ${lang}`,
|
||||||
|
`--ref-lang ${lang}`,
|
||||||
|
|
||||||
|
`--sub-file '${FILE}'`,
|
||||||
|
`--out-file '${FILE}'`,
|
||||||
|
`--ref-file '${VIDEO}'`,
|
||||||
|
|
||||||
|
'--overwrite',
|
||||||
|
];
|
||||||
|
|
||||||
|
console.log(cmd);
|
||||||
|
});
|
BIN
devices/nos/modules/subtitles/syncing/node-syncsub/package-lock.json
generated
Normal file
BIN
devices/nos/modules/subtitles/syncing/node-syncsub/package-lock.json
generated
Normal file
Binary file not shown.
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"devDependencies": {
|
||||||
|
"@stylistic/eslint-plugin": "^1.4.0",
|
||||||
|
"@types/node": "^20.10.5",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^6.9.1",
|
||||||
|
"@typescript-eslint/parser": "^6.9.1",
|
||||||
|
"eslint": "^8.52.0",
|
||||||
|
"typescript": "^5.3.3"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2022",
|
||||||
|
"module": "commonjs",
|
||||||
|
"lib": [
|
||||||
|
"ES2022"
|
||||||
|
],
|
||||||
|
"outDir": "build",
|
||||||
|
"strict": true,
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"baseUrl": ".",
|
||||||
|
"typeRoots": [
|
||||||
|
"./node_modules/@types",
|
||||||
|
],
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"esModuleInterop": true
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue